VC++裡面定義字元串的時候,用_T來保證相容性。VC++支援ascii和unicode兩種字元類型,用_T可以保證從ascii編碼類型轉換到unicode編碼類型的時候,程式不需要修改。
如果将來你不打算更新到unicode,那麼也不需要_T。
_t("hello world")
在ansi的環境下,它是ansi的,如果在unicode下,那麼它将自動解釋為雙位元組字元串,既unicode編碼。
這樣做的好處,不管是ansi環境,還是unicode環境,都适用。
那麼在VC++中,字元串_T("ABC")和一個普通的字元串"ABC"有什麼差別呢?
_T("ABC")
如果定義了unicode,它将表示為L"ABC",每個字元為16位,寬字元串。
如果沒有定義unicode,它就是ascii的"ABC",每個字元為8位。
相當于
#ifdef _UNICODE
#define _T("ABC") L"ABC"
#else
#define _T("ABC") "ABC"
#endif
_T("ABC")中的一個字元和漢字一樣,占兩個位元組,而在"ABC"中,英文字元占一個位元組,漢字占兩個位元組。
一、 在字元串前加一個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,那就用後兩種方法
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是定義在該頭檔案中的宏,它視你是否定義了
NICODE宏而定義成:
定義了_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函數為例子,總結一下:

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

char szString[100];

strcpy(szString,"test");

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

wchar_t szString[100];

wcscpy(szString,L"test");

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

TCHAR szString[100];

_tcscpy(szString,_TEXT("test"));
char是C語言标準資料類型,字元型,至于由幾個位元組組成通常由編譯器決定,一般一個位元組。Windows為了消除各 編譯器的差别,重新定義了一些資料類型,你提到了另外幾個類型都是這樣。
CHAR為單位元組字元。
還有個WCHAR為Unicode字元,即不論中英文,每 個字有兩個位元組組成。
如果目前編譯方式為ANSI(預設)方式,TCHAR等價于CHAR,
如果為Unicode方式,TCHAR等價于WCHAR。
在當 前版本LPCSTR和LPSTR沒差別,即以零結尾的字元串指針,相當于CHAR *。
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宏而定義成:
<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>
CSDN:superarhow說: 不要再使用TCHAR和_T了!他分析了原因後總結:如 果您正開始一個新的項目,請無論如何也要頂住壓力,直接使用UNICODE編碼!切記!您隻需要對您的組員進行10分鐘的教育訓練,記住strcpy用 wcscpy,sprintf用swprintf代替,常數前加L,就可以了!它不會花您很多時間的,帶給您的是穩定和安全!相信偶,沒錯的!!
一、 在字元串前加一個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,那就用後兩種方法。