使用含有 _MBCS 程式碼的 TCHAR.H 資料類型

當定義資訊清單常數 _MBCS 時,指定的泛型文字常式會對應到下列其中一種常式:

  • 適當地處理多位元組位元組、字元與字串的 SBCS 常式。 在此案例中,字串引數類型必須是 char*。 例如,_tprintf 對應到 printf;傳遞到 printf 的字串引數類型是 char*。 若為字串類型使用 _TCHAR 泛型文字資料類型,printf 的正式與實際參數類型會相符,因為 _TCHAR* 對應到 char*

  • MBCS 特定常式。 在此案例中,字串引數類型必須是 unsigned char*。 例如,_tcsrev 對應到 _mbsrev,它預期並傳回類型為 unsigned char* 的字串。 如果您的字串類型使用了 _TCHAR 泛型文字資料類型,可能會發生類型衝突,因為 _TCHAR 對應至類型 char

下面是防止此類型衝突 (以及可能會產生的 C 編譯器警告或 C++ 編譯器錯誤) 的三種解決方式:

  • 使用預設行為。 tchar 會在執行時間程式庫中提供常式的泛型文字常式原型,如下列範例所示。

    char * _tcsrev(char *);
    

    在預設案例中,會透過 Libc 中的 Thunk 對應至 _mbsrev 的原型 _tcsrev 。 這會將傳入參數和傳出傳回值的類型 _mbsrev_TCHAR* (() ) char * 變更為 unsigned char * 。 當您使用 _TCHAR 時,這個方法可確保類型相符,但因為函式呼叫的額外負荷,所以會相當緩慢。

  • 透過在您的程式碼中併入下列前置處理器陳述式,以內嵌方式使用函式。

    #define _USE_INLINING
    

    這個方法會造成 tchar 中提供的內嵌函式 Thunk,以將泛型文字常式直接對應至適當的 MBCS 常式。 下列程式碼摘錄自 tchar,提供如何完成這項操作的範例。

    __inline char *_tcsrev(char *_s1)
    {return (char *)_mbsrev((unsigned char *)_s1);}
    

    若您可以使用內嵌,這是最佳解決方式,因為它可以保證類型相符,而且沒有任何額外成本。

  • 在您的程式碼中併入下列預處理器語句,以使用直接對應。

    #define _MB_MAP_DIRECT
    

    若您不想使用預設行為或無法使用內嵌,此方法提供快速替代方式。 它會讓宏將一般文字常式直接對應到常式的 MBCS 版本,如下列 tchar 範例所示。

    #define _tcschr _mbschr
    

    當您採用這種方法時,必須小心確保針對字串引數和字串傳回值使用適當的資料類型。 您可以使用類型轉換來確保適當的類型相符,或者可以使用 _TXCHAR 泛型文字資料類型。 _TXCHAR 對應到 SBCS 代碼中的類型 char,但對應到 MBCS 代碼中的類型 unsigned char。 如需有關泛型文字宏的詳細資訊,請參閱《執行時間程式庫參考》中的泛型文字對應。

另請參閱

Tchar 中的泛型文字對應