1. 程式人生 > >_T 巨集定義

_T 巨集定義

_T 是一個巨集定義,作用是讓你的程式支援 Unicode 編碼
因為 Windows 使用兩種字符集 ANSI 和 UNICODE前者就是通常使用的單位元組方式,但這種方式處理像中文這樣的雙位元組字元不方便,容易出現半個字元的情況,而後者都是雙位元組方式,方便處理雙位元組字元。Windows NT 的所有與字元有關的函式都提供兩種方式的版本,而 Windows 9x 只支援 ANSI 方式。
如果你編譯一個程式為 ANSI 方式,_T實際不起任何作用。
而如果編譯一個程式為 UNICODE 方式,則編譯器會把 “Hello” 字串以 UNICODE 方式儲存。_T和L的區別在於,L不管你是以什麼方式編譯,一律以UNICODE方式儲存LPSTR:32bit指標指向一個字串,每個字元佔1位元組

  • LPCSTR:32-bit指標指向一個常字串,每個字元佔1位元組
  • LPCTSTR:32-bit指標指向一個常字串,每字元可能佔1位元組或2位元組,取決於Unicode是否定義
  • LPTSTR:32-bit指標每字元可能佔1位元組或2位元組,取決於Unicode是否定義
    L是表示字串資源為Unicode的。

比如:

wchar_t Str[] = L"Hello World!";

這個就是雙子節儲存字元了。
_T是一個適配的巨集

  • 定義 #ifdef _UNICODE 的時候,_T就是L
  • 沒有定義 #ifdef _UNICODE 的時候,_T就是ANSI的。

比如:

LPTSTR lpStr = new TCHAR[32];
TCHAR* szBuf = _T("Hello");

以上兩句使得無論是在UNICODE編譯條件下都是正確編譯的,而且MS推薦你使用相匹配的字串函式,比如處理LPTSTR或者LPCTSTR 的時候,不要用strlen ,而是要用_tcslen,否則在UNICODE的編譯條件下,strlen不能處理 wchar_t*的字串。
T是非常有意思的一個符號(TCHAR、LPCTSTR、LPTSTR、_T()、_TEXT()…),它表示使用一種中間型別,既不明確表示使用 MBCS,也不明確表示使用 UNICODE。那到底使用哪種字符集?編譯的時候才決定。