Tchar h 中的一般文字對映

2021-06-20 11:15:26 字數 3191 閱讀 5524

visual studio 2013

其他版本

此主題尚未評級 -

評價此主題

為簡化**的傳輸,便於在國際上使用,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

intunsigned 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);

因此,您可以編寫、維護和編譯與三種字符集中任何一種的特定例程一起執行的單個源**檔案。

請參見

概念visual c++ 中的文字和字串

將 tchar.h 資料型別用於 _mbcs **

MySQL中INSERT的一般用法

insert語句是最常見的sql語句之一,但是mysql中insert語句的用法和標準用法不盡相同,下文就為您詳細介紹mysql中insert的一般用法,供您參考。mysql中insert的一般用法 mysql中的insert語句和標準的insert不太一樣,在標準的sql語句中,一次插入一條記錄的...

c 中的向量一般操作

vector的刪除操作 1.可以使用四種方式刪除vector中的元素 第一種是使用向量容器vector的成員函式erase 使用這種方式並不能清除刪除元素所佔的記憶體空間 由於向量容器vector中的元素在記憶體中都是按順序排放的,所以刪除某個元素後,會導致迭代器失效,因為刪除了乙個元素會使其他元素...

MySQL 中 INSERT 的一般用法

在標準的sql語句中,一次插入一條記錄的insert語句只有一種形式。insert into tablename 列名 values 列值 而在mysql中還有另外一種形式。insert into tablename set column name1 value1,column name2 valu...