天天看點

TCHAR,LPCSTR,LPSTR,LPCTSTR,LPTSTR簡介

char是C語言标準資料類型,字元型,至于由幾個位元組組成通常由編譯器決定,一般一個位元組。Windows為了消除各編譯器的差别,重新定義了一些資料類型,你提到了另外幾個類型都是這樣。CHAR為單位元組字元。還有個WCHAR為Unicode字元,即不論中英文,每個字有兩個位元組組成。它實際定義在<string.h>裡: typedef unsigned short wchar_t。

下面在看看TCHAR。如果你希望同時為ANSI和Unicode編譯的源代碼,那就要include TChar.h。TCHAR是定義在其中的一個宏,它視你是否定義了_UNICODE宏而定義成char或者wchar_t。如果目前編譯方式為ANSI(預設)方式,TCHAR等價于CHAR,如果為Unicode方式,TCHAR等價于WCHAR。

不能使用類似strcpy這樣的ANSI C字元串函數來處理wchar_t字元串,必須使用wcs字首的函數,例如wcscpy。為了讓編譯器識别Unicode字元串,必須以在前面加一個“L”,例如:

 wchar_t *szTest=L"This is a Unicode string.";

 如果你使用了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"));

在目前版本LPCSTR和LPSTR沒差別,即以零結尾的字元串指針,相當于CHAR *。

LPCSTR       A   32-bit   pointer   to   a   constant   character   string.  

  常量指針,一般用于參數傳遞和固定字元串  

  LPSTR       A   32-bit   pointer   to   a   character   string.  

  普通指針,一般用于字元串操作  

  根據DBCS或Unicode   自動選擇char或wchar_t類型,由定義的宏_UNICODE決定  

  LPCTSTR       A   32-bit   pointer   to   a   constant   character   string   that   is   portable   for   Unicode   and   DBCS.  

  LPTSTR       A   32-bit   pointer   to   a   character   string   that   is   portable   for   Unicode   and   DBCS.

一個轉換CString 的例子。

 CString str = "ABC";

LPCTSTR ptr1 = new TCHAR[str.GetLength()+1];

ptr1 = (LPCTSTR) str.GetBuffer();

LPTSTR ptr2 = new TCHAR[str.GetLength()+1];

ptr2 = (LPTSTR) str.GetBuffer();

LPSTR ptr3 = new char[str.GetLength()+1];

ptr3 = (LPSTR) str.GetBuffer();

LPCSTR ptr4 = new char[str.GetLength()+1];

ptr4 = (LPCSTR) str.GetBuffer();

另外,要注意選用的函數也要和string類型一緻。比如下面:tmp1=144,tmp2=1,因為sLastChan為寬位元組,存儲為310034003400, atoi函數遇到第一個"00"就會結束。

   CString sLastChan = _T("144");

   int tmp1 = _tstoi((TCHAR*)sLastChan.GetBuffer(sLastChan.GetLength()));

   tmp2 = atoi((char*)sLastChan.GetBuffer(sLastChan.GetLength()));

繼續閱讀