亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如果_T()不能用字符串變量,那么該用哪個函數或者宏呢?

如果_T()不能用字符串變量,那么該用哪個函數或者宏呢?

PHP C
狐的傳說 2022-08-03 15:15:02
說一下我的目的。我在搞輸入法編程。平時習慣用ANSI。現在牽扯到TCHAR不知該咋辦。輸入法送往應用程序的字符串要求是TCHAR的,我不知道如何把ANSI轉換為TCHAR。以前都用_T()轉換,但是現在遇到參數是變量,不知該怎么辦。有啥方法嗎?例如(TCHAR)a或者(LPCTSTR)a的方式?
查看完整描述

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。


查看完整回答
反對 回復 2022-08-08
?
幕布斯7119047

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變量。再不行補基礎去吧。


查看完整回答
反對 回復 2022-08-08
?
慕神8447489

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)

查看完整回答
反對 回復 2022-08-08
  • 3 回答
  • 0 關注
  • 253 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號