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 應用程序定義的是 _MBCS。
在 Tchar.h 中根據條件定義 _TCHAR 數據類型。 如果爲您的生成定義了 _UNICODE 符號,則 _TCHAR 被定義爲 wchar_t;否則,對於單字節和 MBCS 生成,它被定義爲 char。 (wchar_t 是基本的 Unicode 寬字符數據類型,它是 8 位有符號 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 是最有用的。
一般文本 數據類型名稱 |
_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 字符串有可能包含嵌入 null 字節,所以不要在 Unicode 字符串中使用 str 函數族。 同樣,不要在 MBCS(或 SBCS)字符串中使用 wcs 函數族。 |
下列代碼片段闡釋了用於映射到 MBCS、Unicode 和 SBCS 模型的 _TCHAR 和 _tcsrev 的用法。
_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);
因此,您可以編寫、維護和編譯與三種字符集中任何一種的特定例程一起運行的單個源代碼文件。