tchar.h 中的泛型文字對應
為了簡化程式代碼的傳輸以供國際使用,Microsoft 運行時間連結庫為許多數據類型、例程和其他物件提供 Microsoft 特定的泛型文字對應。 您可以使用 tchar.h 中定義的這些對應,根據您使用 #define
語句所定義的指令清單常數,撰寫可針對單一位元組、多位元組或 Unicode 字元集編譯的泛型程式代碼。 泛型文字對應是與 ANSI 不相容的 Microsoft 延伸模組。
藉由使用 tchar.h,您可以從相同的來源建置單一位元組、多位元組字元集 (MBCS) 和 Unicode 應用程式。 tchar.h 會定義具有前置 _tcs
詞的宏,該宏具有正確的預處理器定義、對應至 str
、 _mbs
或 wcs
函式,視需要。 若要建置 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
,類型不符編譯程式警告結果。 有三種方式可避免此警告:
在 tchar.h 中使用類型安全內嵌函式 thunks。 這是預設行為。
在命令行上定義
_MB_MAP_DIRECT
,以使用 tchar.h 中的直接宏。 如果這麼做,就必須手動對應類型。 這是最快的方法,但不是類型安全的方法。在 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);
因此,您可以撰寫、維護及編譯單一原始程式碼檔案,以使用三種字元集之任何一種專屬的例程來執行。
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應