宏_T、_TEXT、TEXT、L區(qū)別
宏_T、_TEXT、TEXT、L區(qū)別
MSDN中對于L的說明有一大堆英文,不過主要的就是:L是用來標(biāo)志一個字符(串)為寬字符(串)
寬字符和多字節(jié)字符的說明如下:(引用自網(wǎng)絡(luò))
寬字符,wide character,該字符集內(nèi)每個字符使用相同的位長;
多字節(jié)字符,multibyte character,每個字符可以是一到多個字節(jié)不等,而某個字節(jié)序列的字符值由字符串或流(stream)所在的環(huán)境背景決定。
當(dāng)你在VS2005以上版本的IDE工作時,可以選擇工作于這兩種不同的編碼方式下,而在Unicode方式下,則要對字符(串)常量前添加L來告訴編譯器它是寬字符
而MS為我們定義了好幾個相關(guān)的宏,下面來一一說明:
_T ? ? ? ? ? ?//定義于tchar.h
_TEXT ? ? ?//同樣定義于tchar.h,具體如下:
?
#define ? ? _T(x) ? ? ? __T(x) ? ? ? ?#define ? ? _TEXT(x) ? ?__T(x) ? ?#ifdef ?_UNICODE ? ?#define ? ? __T(x) ? ? ?L ## x ? ? ? ?// ? ?第210行 ? ? ? ?#else ? ? ? ?#define ? ? __T(x) ? ? ?x ? ? ? ? ? ? ?// ? ?第858行 ? ? ? ?#endif ?
TEXT ? ? //定義于winnt.h
?
#define ? ? TEXT(quote) __TEXT(quote) ? ?#ifdef ?UNICODE ? ? ? ? ? ? ? ? ? ? ? ?#define ? ? __TEXT(quote) L##quote ? ? ? ? ? ? ?#else ? ? ? /* UNICODE */ ? ? ? ? ? ? ? ? ? ? ?#define ? ? __TEXT(quote) quote ? ? ? ? ? ? ? ?#endif ? ? /* UNICODE */ ? ? ? ? ? ? ? ? ?
當(dāng)我看到這里的時候,一下子頭暈了,不知道大家有沒有注意到下面兩個問題:
1.這三個宏分別在兩個不同的文件被定義,看上去一個是運(yùn)行時的頭文件,一個是Win的頭文件
2.前面兩個根據(jù)_UNICODE來確定宏內(nèi)容,另一個則是根據(jù)UNICODE
那如果要同時使用這三個宏的話,那不是要同時定義_UNICODE和UNICODE?帶著問題,我把項(xiàng)目的屬性修改一下
當(dāng)設(shè)置為Unicode編碼的時候,編譯器命令選項(xiàng)中的確同時加入了_UNICODE和UNICODE
看來這應(yīng)該又是MS的歷史遺留問題拉,搜索一下才發(fā)現(xiàn):(引自網(wǎng)絡(luò))
Jeffrey Richter在《Windows核心編程》中說,_UNICODE宏用于C運(yùn)行期頭文件,而UNICODE宏則用于Windows頭文件.當(dāng)編譯源代碼模塊時,通常必須同時定義這兩個宏.
嘻嘻,無意發(fā)現(xiàn)的~~~~扯遠(yuǎn)拉~~~~
看IDE自動生成的代碼,大都使用TEXT這個,應(yīng)該是因?yàn)镮DE生成的都是基于Win的代碼,使用這個也很正常吧
從上面的分析可得:
這幾個宏的效果都是一個的,還是建議大家有事沒事都加上其中一個(_T、_TEXT、TEXT)