tchar.h 中的泛型文字對應
為了針對國際使用簡化程式碼傳輸,Microsoft 執行階段程式庫針對許多資料類型、常式與其他物件提供 Microsoft 的特定「泛型文字」對應。 您可使用 tchar.h 中定義的這些對應,根據您使用 #define
陳述式定義的資訊清單常數,撰寫可針對單一位元組、多位元組或 Unicode 字元集編譯的泛型程式碼。 泛型文字對應是與 ANSI 不相容的 Microsoft 延伸模組。
藉由使用 tchar.h,您可以從相同的來源建置單一位元組、多位元組字元集 (MBCS) 和 Unicode 應用程式。 tchar.h 會定義巨集 (具有前置詞 _tcs
),搭配正確的前處理器定義,可視情況對應至 str
、_mbs
或 wcs
函式。 若要建立 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
時出現類型不符合編譯器警告。 有三種方式可避免此警告:
在 tchar.h 中使用型別安全的內嵌函式 Thunk。 此為預設行為。
在命令列上定義
_MB_MAP_DIRECT
,以在 tchar.h 中使用直接巨集。 如果這麼做,就必須手動對應類型。 這是最快、但類型不安全的方法。在 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);
因此,您可以撰寫、維護及編譯單一原始程式碼檔案,以搭配專屬於三種字元集其中一種的常式執行。