分享方式:


tchar.h 中的泛型文字對應

為了針對國際使用簡化程式碼傳輸,Microsoft 執行階段程式庫針對許多資料類型、常式與其他物件提供 Microsoft 的特定「泛型文字」對應。 您可使用 tchar.h 中定義的這些對應,根據您使用 #define 陳述式定義的資訊清單常數,撰寫可針對單一位元組、多位元組或 Unicode 字元集編譯的泛型程式碼。 泛型文字對應是與 ANSI 不相容的 Microsoft 延伸模組。

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

_TCHAR 資料類型是在 tchar.h 中有條件地定義。 如果為您的組建定義了符號 _UNICODE_TCHAR 會定義為 wchar_t;否則,針對單一位元組和 MBCS 組建,其會定義為 char。 (wchar_t (基本 Unicode 寬字元資料類型) 是 8 位元 signed char 的 16 位元對應項目)。對於國際應用程式,請使用以 _TCHAR 單位而非位元組運作的 _tcs 系列函式。 例如,_tcsncpy 會複製 n _TCHARs,而不是 n 位元組。

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

  1. 在 tchar.h 中使用型別安全的內嵌函式 Thunk。 此為預設行為。

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

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

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

# define 編譯的版本 範例
_UNICODE Unicode (寬字元) _tcsrev 對應到 _wcsrev
_MBCS 多位元組字元 _tcsrev 對應到 _mbsrev
無 (預設既不會定義 _UNICODE,也不會定義 _MBCS) SBCS (ASCII) _tcsrev 對應到 strrev

例如,若已在您的程式中定義 _MBCS,則在 tchar.h 中定義的泛型文字函式 _tcsrev 會對應到 _mbsrev;或者若已定義 _UNICODE,則會對應到 _wcsrev。 若兩者皆否,則 _tcsrev 會對應至 strrev。 已在 tchar.h 中提供其他資料類型對應以方便您進行程式開發,但是 _TCHAR 是最實用的類型。

泛型文字資料類型對應

Generic-Text
資料類型名稱
_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 資料類型