windows編程中的char, TCHAR, WCHAR, LPSTR, LPWSTR, LPCTSTR區別

來源:互聯網
上載者:User

TCHAR可以根據定義編譯變數不同解釋為char, wchar_t。用時需要加入對標頭檔 tchar.h 的檔案
LPXXX其實是指向相應類型的字串的指標(LP -- long pointer)

詳細情況見下文:
In general, a character can be 1 byte or 2 bytes. Lets say 1-byte character is ANSI, using which English characters are represented. And lets say 2-byte character is Unicode, which can
represent ALL languages in the world. 

VC++ support char and wchar_t as
native datatypes for ANSI and Unicode characters respectively.

What if you want your C/C++ program to be Character-mode independent? 
That means, instead of replacing:

char cResponse; // 'Y' or 'N'char sUsername[64];// str* functions

with

wchar_t cResponse; // 'Y' or 'N'wchar_t sUsername[64];// wcs* functions


You can simply code it:

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

Thus, when your project is being compiled as Unicode, the TCHAR would
translate to wchar_t. If it is being compiled as ANSI/MBCS, it would translated to char.
Likewise, instead of using strcpystrlenstrcat (including
the secure versions suffixed with _s); or wcscpywcslenwcscat (including
secure), you can simply use _tcscpy_tcslen_tcscat functions. 

When you need to express hard-coded string, you can use:

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


The non-prefixed string is ANSI string, the L prefixed
string is Unicode, and string specified in _T or TEXT would
be either, depending on compilation.


String classes, like MFC/ATL's CString implement two version using
macro. There are two classes named CStringA for ANSI, CStringW for
Unicode. When you use CString (which is a macro/typedef),
it translates to either of two classes.


Okay. The TCHAR type-definition was for a single character. You
can definitely declare an array of TCHAR. 
What if you want to express a character-pointer,
or a const-character-pointer - Which one of the following?

// ANSI charactersfoo_ansi(char*);foo_ansi(const char*);/*const*/ char* pString;// Unicode/wide-stringfoo_uni(WCHAR*); // or wchar_t*foo_uni(const WCHAR*);/*const*/ WCHAR* pString;// Independent foo_char(TCHAR*);foo_char(const TCHAR*);/*const*/ TCHAR* pString;

After reading about TCHAR stuff, you'd definitely select the last
one as your choice. But here is better alternative. Before that, note that TCHAR.H header file declares only TCHAR datatype
and for the following stuff, you need to include Windows.h (defined in WinNT.h).

NOTE: If your project implicitly or explicitly includes Windows.h,
you need not to include TCHAR.H 

  • char* replacement: LPSTR
  • const char* replacement: LPCSTR
  • WCHAR* replacement: LPWSTR
  • const WCHAR* replacement: LPCWSTR (C before W, since const is before WCHAR)
  • TCHAR* replacement: LPTSTR
  • const TCHAR* replacement: LPCTSTR

Now, I hope, you understand the following signatures  :

BOOL SetCurrentDirectory( LPCTSTR lpPathName );DWORD GetCurrentDirectory(DWORD nBufferLength,LPTSTR lpBuffer);
Continuing. You must have seen some functions/methods asking you to pass number of characters,
or returning the number of characters. Well, like  GetCurrentDirectory, you need to pass number of characters, and not number
of bytes. For example::

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

On the other side, if you need to allocate number or characters, you must allocate proper number of bytes. In C++, you can simply use new:

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

But if you use memory allocation functions like mallocLocalAllocGlobalAlloc etc;
you must specify the number of bytes!

pBuffer = (TCHAR*) malloc (128 * sizeof(TCHAR) );

Typecasting the return value is required, as you know. The expression in malloc's argument ensures that it allocates desired number of bytes - and makes up room for desired number of characters.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.