MFC 中L 和 T 巨集

2021-06-29 00:37:51 字數 1200 閱讀 4775

_t("")是乙個巨集,定義在tchar.h下 .

#define  _t(x) __t(x)

#define  __t(x)  x

#define __t(x)  l##x

tchar*  p =_t("hello");

他的作用是讓你的程式支援unicode編碼 ,  因為windows使用 兩種字符集 ansi 和 unicode , 前者就是通常使用的單位元組方式 , 但這種方式處理像中文這項雙位元組字元不方便,

容易出現半個漢字的情況. 而後者是雙位元組的方式,方便處理雙位元組字元. 

如果你編譯乙個程式為ansi 方式, _t 實際不起任何作用. 而如果編譯乙個程式為unicode 方式,則編譯器會把 _t("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。那到底使用哪種字符集?編譯的時候才決定

MFC中的L和 T巨集

問 define abc l abc l 巨集是幹什麼用的,和unicode相關嗎?如果這樣,這和 define abc t abc 有分別嗎?答 l表示unicode串,比如wchar t str l yangsongx t在ansi編譯模式下表示ansi串,在unicode下表示unicode串...

MFC中L和 T 的區別

1,編碼方式 ascii編碼 用來表示英文,它使用1個位元組表示,其中第一位規定為0,其他7位儲存資料,一共可以表示128個字元。占用乙個位元組,即乙個位元組表示乙個字元 gbk gb2312 gb18030 表示漢字。gb2312表示簡體中文,gbk 是 gb2312的擴充套件 除了相容gb231...

C 中L和 T 之區別

字串前面加l表示該字串是unicode字串。t是乙個巨集,如果專案使用了unicode字符集 定義了unicode巨集 則自動在字串前面加上l,否則字串不變。因此,visual c 裡邊定義字串的時候,用 t來保證相容性。vc支援ascii和unicode兩種字元型別,用 t可以保證從ascii編碼...