3 回答

TA貢獻1963條經驗 獲得超6個贊
_T()其實是一個宏,UNICODE時為L,非UNICODE則為空,而L是修飾常量字符串的。_T()的參數不可以是變量
定義:
_T("")是一個宏,定義于tchar.h下。
#define __T(x) L ## x
#define _T(x) __T(x)
作用:
他的作用是讓程序支持Unicode編碼,
因為Windows使用兩種字符集ANSI和UNICODE,
前者就是通常使用的單字節方式,
但這種方式處理像中文這樣的雙字節字符不方便,
容易出現半個漢字的情況。
而后者是雙字節方式,方便處理雙字節字符。
Windows NT的所有與字符有關的函數都提供兩種方式的版本,而Windows 9x只支持ANSI方式。
如果編譯一個程序為ANSI方式,
_T實際不起任何作用。
而如果編譯一個程序為UNICODE方式,則編譯器會把"Hello"字符串以UNICODE方式保存。_T和_L的區別在于,_L不管是以什么方式編譯,一律以UNICODE方式保存。
LPSTR:32bit指針指向一個字符串,每個字符占1字節
LPCSTR:32-bit指針指向一個常字符串,每個字符占1字節
LPCTSTR:32-bit指針指向一個常字符串,每字符可能占1字節或2字節,取決于Unicode是否定義
LPTSTR:32-bit指針每字符可能占1字節或2字節,取決于Unicode是否定義
L是表示字符串資源為Unicode的。
比如
wchar_tStr[] = L"Hello World!";
這個就是雙字節存儲字符了。
_T是一個適配的宏~
當
#ifdef _UNICODE的時候
_T就是L
沒有#ifdef _UNICODE的時候
_T就是ANSI的。
比如
LPTSTR lpStr = new TCHAR[32];
TCHAR* szBuf = _T("Hello");
以上兩句使得無論是在UNICODE編譯條件下還是在ANSI編譯條件下都是正確編譯的。
而且MS推薦使用相匹配的字符串函數。
比如處理LPTSTR或者LPCTSTR的時候,不要用strlen ,而是要用_tcslen
否則在UNICODE的編譯條件下,strlen不能處理wchar_t*的字符串。
T是非常有意思的一個符號(TCHAR、LPCTSTR、LPTSTR、_T()、_TEXT()...),它表示使用一種中間類型,既不明確表示使用 MBCS,也不明確表示使用 UNICODE。

TA貢獻1794條經驗 獲得超8個贊
_T是為了讓編譯器按照將字符串按照wchar_t類型處理。編譯器處理"data.txt"默認當成ASCII字符處理的,_T的話當成wchar_t處理。
比如下面的例子:
wchar_t sz[]=_T("data.txt");//從ASCII轉換為wchar_t
file.Open(sz,CFile::modeRead);
請看定義:
#define _T(x) __T(x)
#define __T(x) L ## x
_T(a)用宏替換后變成 L## a,a不是字符串,是變量名,無法編譯器報錯。
_T("123")用宏替換后變成 L##"123",編譯器發現"L##"標識后按wchar_t類型處理字符串。
要會自己發掘MFC代碼。
我只是想說樓主你基礎不夠,就再說得直白點了,MFC中wchar_t就是為處理Unicode字符使用的,一個字符2個字節,ASCII一個字符1個字節,這些都是在編譯階段就得確定的。_T("123")按照寬字符處理后占用6字節的內存,按照默認的ACSII方式處理占用3個字節。如果你想將ASCII表示漢子轉換為Unicode編碼也不是不行。MFC為了支持不同的語言將ASCII的后面128到255共128個切割出來,通過兩兩組合的方式來對應到某個漢子,將漢子碼提取出來找到然后計算出Unicode編碼存入wchar_t變量。再不行補基礎去吧。

TA貢獻1780條經驗 獲得超1個贊
不可以,_T()其實是一個宏,UNICODE時為L,非UNICODE則為空,而L是修飾常量字符串的。
如_T("123")相當于L"123",字符串變量是無法用L修飾的,字符串指針定義可用LPTSTR(或LPCTSTR),在UNICODE時相當于WCHAR*(或const WCHAR*),非UNICODE時相當于char*。
例如
LPCTSTR pStr = _T("123");
相當于const WCHAR* pStr = L"123";(UNICODE) 或const char* pStr = "123";(非UNICODE)
- 3 回答
- 0 關注
- 253 瀏覽
添加回答
舉報