天天看點

VC _T的用途

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函數為例子,總結一下:

VC _T的用途

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

VC _T的用途

char szString[100]; 

VC _T的用途

strcpy(szString,"test"); 

VC _T的用途

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

VC _T的用途

wchar_t szString[100]; 

VC _T的用途

wcscpy(szString,L"test"); 

VC _T的用途

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

VC _T的用途

TCHAR szString[100]; 

VC _T的用途

_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,那就用後兩種方法。

繼續閱讀