程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> VC++中關於TCHAR,WCHAR,LPSTR,LPWSTR,LPCTSTR的解釋[轉載]

VC++中關於TCHAR,WCHAR,LPSTR,LPWSTR,LPCTSTR的解釋[轉載]

編輯:C++入門知識

一般來說,一個字符(character)占用1字節或是2字節,我們說1字節的字符是ANSI,他可以用來表示英語字母,而2字節的我們稱之為Unicode,可以表示世界上所有的語言。。
VC++使用char和wchar_t的內置數據類型來分別作為表示ANSI和Unicode字符。
如果你想讓你的C/C++程序是字符集無關的,該怎麼做呢?
如果你用通常的字符集來寫,你可能會寫成這樣的。

char sUsername[64];
// str* functions

和這樣的

wchar_t sUsername[64];
// wcs* functions

而現在,你可以簡單的這樣寫。

#include<TCHAR.H> // Implicit or explicit include
TCHAR cResponse; // 'Y' or 'N'
TCHAR sUsername[64];
// _tcs* functions

從此,當你的項目被作為Unicode編譯的時候,TCHAR將會被轉換成wchar_t,如果是被作為ANSI/MBCS來編譯,則會自動轉換成char,

同樣的,比起使用strcpy, strlen, strcat(也包含以_s結尾的安全版本)或者wcscpy, wcslen,wcscat(安全版本也可),你可以簡單的使用_tcscpy,_tcslen, _tcscat 這些函數。

當你表示硬編碼的string時,你可以使用

L"Unicode String"; // Unicode

_T("Either string, depending on compilation"); // ANSI or Unicode
// or use TEXT macro, if you need more readability.

沒有前綴的string是ANSI string,有L前綴的是Unicode,而又_T或者TEXT指定的string則二者皆可,取決於編譯器。

String類,像MFC/ATL的CString類使用宏實現了兩個版本,CStringA是ANSI,CStringW是為Unicode,當你使用CString(一個宏/typedef)的時候,會被自動轉換成兩個類中的一個

ok,TCHAR是一個單字符,你就可以清晰的定義一個TCHAR數組,當你想表示一個字符指針或const字符指針的時候,你會使用下面三個中的哪個呢?

foo_ansi(char*);
foo_ansi(const char*);
/*const*/ char* pString;

// Unicode/wide-string
foo_uni(WCHAR*); // or wchar_t*
foo_uni(const WCHAR*);
/*const*/ WCHAR* pString;

// Independent 
foo_char(TCHAR*);
foo_char(const TCHAR*);
/*const*/ TCHAR* pString;

當讀完一些關於TCHAR的內容的時候,你應該會選擇一個正確的,但是,事實上,還有更好的選擇,在那之前,注意TCHAR.H頭文件僅僅生命了TCHAR類型,而為了使用下面的類型,你需要
吧Windows.h包含進去。

注意:如果你的項目已經隱式或是顯式地包含了Windows.h那就不必包含了。

char* 替換: LPSTR
const char* 替換: LPCSTR
WCHAR* 替換: LPWSTR
const WCHAR* 替換: LPCWSTR (C在W之前, 因為 const 在 WCHAR之前)
TCHAR* 替換: LPTSTR
const TCHAR* 替換: LPCTSTR

現在,希望你可以理解下面的函數原型

DWORD GetCurrentDirectory(DWORD nBufferLength,LPTSTR lpBuffer);

繼續,你一定見過一些函數/方法讓你傳遞字符集的大小,或者返回它的大小,比如GetCurrentDirectory函數,需要傳遞字符的數目而不是字節的數目舉個例子

// Pass 255 and not 255*2 
GetCurrentDirectory(sCurrentDir, 255);

另一方面,如果你需要分配字符的數目,你比如分配適當大小的字節,在C++中,你可以簡單的使用new方法:

pBuffer = new TCHAR[128]; // Allocates 128 or 256 BYTES, depending on compilation.

但是,你如果你使用內存分配函數像malloc,LocalAlloc, GlobalAlloc, 等,你必須指定字節數。


對返回值進行一次類型轉換是必需的,如你所知,在malloc的參數中,確定了分配字節的大小,並在內存中開辟相應的空間。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved