使用含有 _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.h 提供執行時間程式庫中常式的泛型文字常式原型,如下列範例所示。

    char * _tcsrev(char *);
    

    在預設案例中,對應至 _mbsrev Libc.lib 中 Thunk 的原型 _tcsrev 。 這會將傳入參數的類型 _mbsrev 和傳出傳回值從 _TCHAR* (也就是 char * ) 變更為 unsigned char * 。 此方法可確保使用 _TCHAR 時的類型比對,但由於函式呼叫額外負荷,所以比較慢。

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

    #define _USE_INLINING
    

    此方法會導致 tchar.h 中提供的內嵌函式 Thunk,將泛型文字常式直接對應至適當的 MBCS 常式。 下列來自 tchar.h 的程式碼摘錄提供如何完成此作業的範例。

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

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

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

    #define _MB_MAP_DIRECT
    

    若您不想使用預設行為或無法使用內嵌,此方法提供快速替代方式。 它會導致宏直接對應至常式的 MBCS 版本,如下列來自 tchar.h 的範例所示。

    #define _tcschr _mbschr
    

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

另請參閱

tchar.h 中的泛型文字對應