windows编程中的char, TCHAR, WCHAR, LPSTR, LPWSTR, LPCTSTR区别

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 include

TCHAR 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  strcpy strlen strcat  (including the secure versions suffixed with  _s ); or  wcscpy wcslen wcscat  (including secure), you can simply use  _tcscpy _tcslen _tcscat  functions. 

When you need to express hard-coded string, you can use:
"ANSI String"; // ANSI
L"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 characters
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;
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  Cool  :
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  malloc LocalAlloc GlobalAlloc  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.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值