【转】TCHAR
TCHAR 就是當你的字符設置為什么就是什么
例如:
當程序編譯為 ? ?ANSI, ? ?TCHAR 相當于 CHAR
當程序編譯為 UNICODE, TCHAR 相當于WCHAR
char ? ? ? : 單字節變量類型,最多表示256個字符
wchar_t : 寬字節變量類型,用于表示Unicode字符
它實際定義在<string.h>里:typedef unsigned short wchar_t。
為了讓編譯器識別Unicode字符串,必須以在前面加一個“L”,定義寬字節類型方法如下:
? ?wchar_t c = `A' ;?
wchar_t * p = L"Hello!" ;?
wchar_t a[] = L"Hello!" ;
其中,寬字節類型每個變量占用2個字節,故上述數組a的sizeof(a) = 14
TCHAR / _T( ) :?
如果在程序中既包括ANSI又包括Unicode編碼,需要包括頭文件tchar.h。
TCHAR是定義在該頭文件中的宏,它視你是否定義了_UNICODE宏而定義成:?
定義了_UNICODE:??? typedef wchar_t TCHAR ;?
沒有定義_UNICODE: typedef char TCHAR ;
#ifdef UNICODE?
typedef char TCHAR;?
#else?
typede wchar_t TCHAR;?
#endif?
_T( )也是定義在該頭文件中的宏,視是否定義了_UNICODE宏而定義成
定義了_UNICODE:??? #define _T(x) L##x?
沒有定義_UNICODE: #define _T(x) x?
注意:如果在程序中使用了TCHAR,那么就不應該使用ANSI的strXXX函數或者Unicode的wcsXXX函數了,而必須使用tchar.h中定義的_tcsXXX函數
?
一、 在字符串前加一個L作用:?
?? 如? L"我的字符串"??? 表示將ANSI字符串轉換成unicode的字符串,就是每個字符占用兩個字節。?
? strlen("asd")?? =?? 3;???
? strlen(L"asd")?? =?? 6;?
? 二、? _T宏可以把一個引號引起來的字符串,根據你的環境設置,使得編譯器會根據編譯目標環境選擇合適的(Unicode還是ANSI)字符處理方式?
?? 如果你定義了UNICODE,那么_T宏會把字符串前面加一個L。這時 _T("ABCD") 相當于 L"ABCD" ,這是寬字符串。?
?? 如果沒有定義,那么_T宏不會在字符串前面加那個L,_T("ABCD") 就等價于 "ABCD"?
三、TEXT,_TEXT 和_T 一樣的?
如下面三語句:???
? TCHAR?? szStr1[]?? =?? TEXT("str1");???
? char?? szStr2[]?? =?? "str2";???
? WCHAR?? szStr3[]?? =?? L("str3");???
? 那么第一句話在定義了UNICODE時會解釋為第三句話,沒有定義時就等于第二句話。???
? 但二句話無論是否定義了UNICODE都是生成一個ANSI字符串,而第三句話總是生成UNICODE字符串。???
? 為了程序的可移植性,建議都用第一種表示方法。???
? 但在某些情況下,某個字符必須為ANSI或UNICODE,那就用后兩種方法。
轉載于:https://www.cnblogs.com/xiongyunqi/p/4389063.html
總結
- 上一篇: mysql 自定义函数
- 下一篇: 在Vista以上版本运行WTL程序,有时