_T、_TEXT、L、TEXT之間的區別
在分析前先對三者做一個簡單的分類
_T、_TEXT、TEXT三者都是根據編譯器的環境進行ANSI/UNICODE變換的,_T和_TEXT是根據_UNICODE來確定宏,而TEXT是根據UNICODE來確定宏,
(_UNICODE宏用於C運行期頭文件,而UNICOED則用於Windows頭文件,當編譯源代碼模塊時,通常必須同時定義這兩個宏)
第一種:L" "
在字符串前加一個大寫字母L表示,告訴編譯器這個字符串按照寬字符來存儲,每個字符占2個字節
格式為或者
,L的特點就是無論以什么方式編譯,一律按照Unicode來編譯(即每個字符占兩個字節),這里說每個字符占兩個字節,是因為Unicode字符集一般是指UTF-16編碼的Unicode,但Unicode字符集不等於每個字符占兩個字符
在VC2010Express下可以通過項目--屬性--配置屬性--常規來看編譯方式
當使用Unicode字符集時,可以在C/C++--預處理器看到預編譯宏_UNICODE和UNICODE
當設置為使用多字節字符集時,預編譯宏會變為_MBCS
第二種:_T()和_TEXT()
_T和_TEXT都在頭文件tchar.h中定義,在字符串之間加_TEXT或者是_T的效果是一樣的,與L不同的是,如果項目使用了Unicode字符集(定義了UNICODE宏),則自動在字符串前面加上L,否則字符串不變
(意思是如果編譯環境使用的多字符節字符集 或者是 未設置,那么字符串不變),_T和_TEXT是根據_UNICODE來確定宏的
在tchar.h中可以找到如下的宏定義
使用格式:(注意:圓括號是不能省略的)
下面把環境改成多字節字符集
char ss[20] = _T("Hello World"); wchar_t mm[20] = L"Hello World"; printf("%s\n", ss); wprintf(L"%s", mm);
上面的代碼中ss這個窄字符數組后面的字符串前面加了一個_T,但因為環境是多字節字符集,_T並沒有起作用,字符串內容不變仍然按照窄字符存儲,而第二個寬字符數組mm就不能寫成_T或者_TEXT
因為不能把一個窄字符串存儲到一個寬字符數組中,如果寫成那么在編譯階段就會報錯
第三種:TEXT()
需要注意的是如果只#include<WinNT.h>編譯器是會報錯的,需要在#include<WinNT.h>前加上#include <Windows.h>才能使用TEXT,TEXT是根據UNICODE來確定宏的,因為當編譯環境使用Unicode字符集時,
因為預編譯宏包含了_UNICODE和UNICODE,所以在使用Unicode字符集的環境下_T、_TEXT、TEXT都可以使用
使用格式: