1. 程式人生 > >巨集_T、_TEXT、TEXT、L區別

巨集_T、_TEXT、TEXT、L區別

百度或谷歌一下,有很多大牛早已經寫過無數相關的文章說明這幾個巨集的作用

而我嘛,寫這篇東東當是給自己一個提醒,因為之前直接使用了L這個標誌,搞到後來要自己手動轉編碼

MSDN中對於L的說明有一大堆英文,不過主要的就是:L是用來標誌一個字元(串)為寬字元(串)

寬字元和多位元組字元的說明如下:(引用自網路)

寬字元,wide character,該字符集內每個字元使用相同的位長;

多位元組字元,multibyte character,每個字元可以是一到多個位元組不等,而某個位元組序列的字元值由字串或流(stream)所在的環境背景決定。

當你在VS2005以上版本的IDE工作時,可以選擇工作於這兩種不同的編碼方式下,而在Unicode方式下,則要對字元(串)常量前新增L來告訴編譯器它是寬字元

而MS為我們定義了好幾個相關的巨集,下面來一一說明:

_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 */

當我看到這裡的時候,一下子頭暈了,不知道大家有沒有注意到下面兩個問題:

1.這三個巨集分別在兩個不同的檔案被定義,看上去一個是執行時的標頭檔案,一個是Win的標頭檔案

2.前面兩個根據_UNICODE來確定巨集內容,另一個則是根據UNICODE

那如果要同時使用這三個巨集的話,那不是要同時定義_UNICODE和UNICODE?帶著問題,我把專案的屬性修改一下

當設定為Unicode編碼的時候,編譯器命令選項中的確同時加入了_UNICODE和UNICODE

看來這應該又是MS的歷史遺留問題拉,搜尋一下才發現:(引自網路)

Jeffrey Richter在《Windows核心程式設計》中說,_UNICODE巨集用於C執行期標頭檔案,而UNICODE巨集則用於Windows標頭檔案.當編譯原始碼模組時,通常必須同時定義這兩個巨集.

嘻嘻,無意發現的~~~~扯遠拉~~~~

看IDE自動生成的程式碼,大都使用TEXT這個,應該是因為IDE生成的都是基於Win的程式碼,使用這個也很正常吧

從上面的分析可得:

這幾個巨集的效果都是一個的,還是建議大家有事沒事都加上其中一個(_T、_TEXT、TEXT)

而L嘛,個人認為還是不要在程式碼中直接使用

好拉,就這麼多,歡迎各位大牛來圍觀指正~~~