天天看點

關于char, wchar_t, TCHAR, _T(),L,宏 _T、TEXT,_TEXT

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函數。

以strcpy函數為例子,總結一下:

<code>//如果你想使用ANSI字元串,那麼請使用這一套寫法:</code>

<code>char</code> <code>szString[100];</code>

<code>strcpy</code><code>(szString,</code><code>"test"</code><code>);</code>

<code>//如果你想使用Unicode字元串,那麼請使用這一套:</code>

<code>wchar_t</code> <code>szString[100];</code>

<code>wcscpy(szString,L</code><code>"test"</code><code>);</code>

<code>//如果你想通過定義_UNICODE宏,而編譯ANSI或者Unicode字元串代碼:</code>

<code>TCHAR</code> <code>szString[100];</code>

<code>_tcscpy(szString,_TEXT(</code><code>"test"</code><code>));</code>

一、 在字元串前加一個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,那就用後兩種方法

繼續閱讀