tchar.h 中的泛型文字對應

為了簡化程式代碼的傳輸以供國際使用,Microsoft 運行時間連結庫為許多數據類型、例程和其他物件提供 Microsoft 特定的泛型文字對應。 您可以使用 tchar.h 中定義的這些對應,根據您使用 #define 語句所定義的指令清單常數,撰寫可針對單一位元組、多位元組或 Unicode 字元集編譯的泛型程式代碼。 泛型文字對應是與 ANSI 不相容的 Microsoft 延伸模組。

藉由使用 tchar.h,您可以從相同的來源建置單一位元組、多位元組字元集 (MBCS) 和 Unicode 應用程式。 tchar.h 會定義具有前置 _tcs詞的宏,該宏具有正確的預處理器定義、對應至 str_mbswcs 函式,視需要。 若要建置 MBCS,請定義 符號 _MBCS。 若要建置 Unicode,請定義 符號 _UNICODE。 若要建置單一位元組應用程式,請定義兩者 (預設值)。 根據預設, _UNICODE 會針對 MFC 應用程式定義。

數據類型 _TCHAR 是在 tchar.h 中有條件地定義。 如果為組建定義符號_UNICODE,則會定義為 wchar_t,否則,針對單一位元組和 MBCS 組建, 則會定義為 char_TCHAR 。 (wchar_t,基本 Unicode 寬字元數據類型,是 8 signed char位的 16 位對應專案。對於國際應用程式,請使用 _tcs 以單位而非位元組運作 _TCHAR 的函式系列。 例如, _tcsncpy 複製 n_TCHARs,而非 n 位元組。

由於某些單一位元組字元集 (SBCS) 字串處理函式採用 (signed) char* 參數,因此定義 時 _MBCS ,類型不符編譯程式警告結果。 有三種方式可避免此警告:

  1. 在 tchar.h 中使用類型安全內嵌函式 thunks。 這是預設行為。

  2. 在命令行上定義 _MB_MAP_DIRECT ,以使用 tchar.h 中的直接宏。 如果這麼做,就必須手動對應類型。 這是最快的方法,但不是類型安全的方法。

  3. 在 tchar.h 中使用類型安全靜態連結庫函式 Thunks。 若要這樣做,請在命令列上定義常數 _NO_INLINING。 這是最慢、但類型最安全的方法。

泛型文字對應的前置處理器指示詞

# define 編譯的版本 範例
_UNICODE Unicode (寬字元) _tcsrev 對應到 _wcsrev
_MBCS 多位元組字元 _tcsrev 對應到 _mbsrev
沒有沒有定義預設值的預設值沒有 _UNICODE 沒有 _MBCS 定義 ) SBCS (ASCII) _tcsrev 對應到 strrev

例如,在 tchar.h 中定義的泛型文字函_tcsrev式會對應至_mbsrev您在程式中定義_MBCS,或定義 時_UNICODE對應至 _wcsrev 。 若兩者皆否,則 _tcsrev 會對應至 strrev。 tchar.h 中提供其他數據類型對應,以方便程序設計,但 _TCHAR 最實用。

泛型文字資料類型對應

泛型文字
數據類型名稱
_UNICODE &
未定義_MBCS
_MBCS
已定義
_UNICODE
已定義
_TCHAR char char wchar_t
_TINT int unsigned int wint_t
_TSCHAR signed char signed char wchar_t
_TUCHAR unsigned char unsigned char wchar_t
_TXCHAR char unsigned char wchar_t
_T_TEXT 無效果 (已由前置處理器移除) 無效果 (已由前置處理器移除) L (將下列字元或字串轉換為其 Unicode 對應專案)

如需例程、變數和其他物件的泛型文字對應清單,請參閱 運行時間連結庫參考中的泛型文字對應

注意

請勿搭配 Unicode 字串使用 str 函式系列,這可能包含內嵌的 Null 位元組。 同樣地,請勿搭配 MBCS (或 SBCS) 字串使用 wcs 函式系列。

下列程式碼片段示範如何使用 _TCHAR_tcsrev 來對應到 MBCS、Unicode 與 SBCS 模型。

_TCHAR *RetVal, *szString;
RetVal = _tcsrev(szString);

如果 _MBCS 已經定義,預處理器會將此片段對應至此程式代碼:

char *RetVal, *szString;
RetVal = _mbsrev(szString);

如果 _UNICODE 已經定義,預處理器會將此片段對應至此程式代碼:

wchar_t *RetVal, *szString;
RetVal = _wcsrev(szString);

_MBCS如果未定義 或 _UNICODE ,預處理器會將片段對應至單一位元組 ASCII 程式代碼,如下所示:

char *RetVal, *szString;
RetVal = strrev(szString);

因此,您可以撰寫、維護及編譯單一原始程式碼檔案,以使用三種字元集之任何一種專屬的例程來執行。

另請參閱

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