_T("Hello")是一個宏,他的作用是讓你的程序支持Unicode編碼,因為Windows使用兩種字符集ANSI和UNICODE,前者就是通常使用的單字節方式,但這種方式處理象中文這樣的雙字節字符不方便,容易出現半個漢字的情況。而后者是雙字節方式,方便處理雙字節字符。
Windows NT的所有與字符有關的函數都提供兩種方式的版本,而Windows 9x只支持ANSI方式。
如果你編譯一個程序為ANSI方式,_T實際不起任何作用。而如果編譯一個程序為UNICODE方式,則編譯器會把"Hello"字符串以UNICODE方式保存。
_T和_L的區別在於,_L不管你是以什么方式編譯,一律以UNICODE方式保存。
---------------------------------------------------------------------------------------------------------------
1\C++語言中“_T”是什么意思?
Visual C++里邊定義字符串的時候,用_T來保證兼容性,VC支持ascii和unicode兩種字符類型,用_T可以保證從ascii編碼類型轉換到unicode編碼類型的時候,程序不需要修改。
如果將來你不打算升級到unicode,那么也不需要_T,
---------------------------------------------------------
_t("hello world")
在ansi的環境下,它是ansi的,如果在unicode下,那么它將自動解釋為雙字節字符串,既unicode編碼。
這樣做的好處,不管是ansi環境,還是unicode環境,都適用。
2\請問在vc++中的字符串_T("ABC")和一個普通的字符串“ABC”有什么區別。
_T("ABC")
表示如果定義了unicode
它表示 L"ABC",每個字符為16位,寬字符字符串
---------------------------------------------------------
if not UNICODE
它就是ascii的"ABC",每個字符為8位
"ABC"就是指ascii字符串"ABC"
----------------------------------------------------------
相當於
#ifdef _UNICODE
#define _T("ABC") L"ABC"
#else
#define _T("ABC") "ABC"
#endif
----------------------------------------------------------
_T("ABC")中的一個字符和漢字一樣,占兩個字節,而在"ABC"中,英文字符占一個字節,漢字占兩個字節
---------------------------------------------------------------------------------------------------------------
_T在tchar.h頭文件中定義了:
#define __T(x) L ## x
#define _T(x) __T(x)
-- ##在宏里面相當於連接符,把前后兩個字符串連在一起作為一個字符串。
以下來自網絡:
#define Conn(x,y) x##y
#define ToChar(x) #@x
#define ToString(x) #x
x##y表示什么?表示x連接y,舉例說:
int n = Conn(123,456); 結果就是n=123456;
char* str = Conn("asdf", "adf")結果就是 str = "asdfadf";
怎么樣,很神奇吧
再來看#@x,其實就是給x加上單引號,結果返回是一個const char。舉例說:
char a = ToChar(1);結果就是a='1';
做個越界試驗char a = ToChar(123);結果是a='3';
但是如果你的參數超過四個字符,編譯器就給給你報錯了!error C2015: too many characters in constant :P
最后看看#x,估計你也明白了,他是給x加雙引號
char* str = ToString(123132);就成了str="123132";
先說寬字符常量,它是用來支持某些語言的字符集合,如漢語、日語,這些語言中的某些字符不能用單個字符表示。於是想對應的就有了寬字符串咯! |