搞清楚VC++中的char,wchar_t,TCHAR
大家一起做一個專案,經常發現有的人愛用strcpy等標準ANSI函式,有的人愛用_tXXXX函式,這個問題曾經搞的很混亂。為了統一,有必要把來龍去脈搞清楚。
為了搞清這些函式,就必須理請幾種字元型別的寫法。char就不用說了,先說一些wchar_t。wchar_t是Unicode字元的資料型別,它實際定義在<string.h>裡:
typedef unsigned short wchar_t;
不能使用類似strcpy這樣的ANSI C字串函式來處理wchar_t字串,必須使用wcs字首的函式,例如wcscpy。為了讓編譯器識別Unicode字串,必須以在前面加一個“L”,例如:
wchar_t *szTest=L"This is a Unicode string.";
下面在看看TCHAR。如果你希望同時為ANSI和Unicode編譯的原始碼,那就要include TChar.h。TCHAR是定義在其中的一個巨集,它視你是否定義了_UNICODE巨集而定義成char或者wchar_t。如果你使用了TCHAR,那麼就不應該使用ANSI的strXXX函式或者Unicode的wcsXXX函數了,而必須使用TChar.h中定義的_tcsXXX函式。另外,為了解決剛才提到帶“L”的問題,TChar.h中定義了一個巨集:“_TEXT”。
以strcpy函式為例子,總結一下:
.如果你想使用ANSI字串,那麼請使用這一套寫法:
char szString[100];
strcpy(szString,"test");
.如果你想使用Unicode字串,那麼請使用這一套:
wchar_t szString[100];
wcscpyszString,L"test");
.如果你想通過定義_UNICODE巨集,而編譯ANSI或者Unicode字串程式碼:
TCHAR szString[100];
_tcscpy(szString,_TEXT("test"));
參考資料:Windows核心程式設計,Jeffrey Richter
2005年12月5日