[笔记]LPSTR, LPCSTR, LPWSTR, LPCWSTR, LPTSTR, LPCTSTR, CString, TCHAR 的含义

关于标题的问题,网上找了些文章,转帖在这里以作记录。

在“delphi中关于LPCTSTR,LPTSTR,CSTRING,CHAR *等等的区别”中,写到:

在vc++中有着各种字符串的表示法,首先char* 是指向ANSI字符数组的指针,其中每个字符占据8位(有效数据是除掉最高位的其他7位),这里保持了与传统的C,C++的兼容。
LP的含义是长指针(long pointer)。LPSTR是一个指向以‘\0’结尾的ANSI字符数组的指针,与char*可以互换使用,在win32中较多地使用LPSTR。而LPCSTR中增加的‘C’的含义是“CONSTANT”(常量),表明这种数据类型的实例不能被使用它的API函数改变,除此之外,它与LPSTR是等同的。
为了满足程序代码国际化的需要,业界推出了Unicode标准,它提供了一种简单和一致的表达字符串的方法,所有字符中的字节都是16位的值,其数量也可以满足差不多世界上所有书面语言字符的编码需求,开发程序时使用Unicode(类型为wchar_t)是一种被鼓励的做法。
LPWSTR与LPCWSTR由此产生,它们的含义类似于LPSTR与LPCSTR,只是字符数据是16位的wchar_t而不是char。
然后为了实现两种编码的通用,提出了TCHAR的定义:

如果定义_UNICODE,声明如下:
typedef wchar_t TCHAR;
如果没有定义_UNICODE,则声明如下:
typedef char TCHAR;

LPTSTR和LPCTSTR中的含义就是每个字符是这样的TCHAR。
CString类中的字符就是被声明为TCHAR类型的,它提供了一个封装好的类供用户方便地使用。

在MSDN的“Data Type Mappings”中有表格如下:

Generic-text data type name SBCS (_UNICODE, _MBCS not defined) _MBCS defined _UNICODE defined
_TCHAR char char wchar_t
_tfinddata_t _finddata_t _finddata_t _wfinddata_t
_tfinddata64_t __finddata64_t __finddata64_t __wfinddata64_t
_tfinddatai64_t _finddatai64_t _finddatai64_t _wfinddatai64_t
_TINT int int wint_t
_TSCHAR signed char signed char wchar_t
_TUCHAR unsigned char unsigned char wchar_t
_TXCHAR char unsigned char wchar_t
_T or _TEXT No effect (removed by preprocessor) No effect (removed by preprocessor) L (converts following character or string to its Unicode counterpart)

在“如何理解LPCTSTR类型?”中有写到:

L表示long指针,这是为了兼容Windows 3.1等16位操作系统遗留下来的, 在win32中以及其他的32为操作系统中, long指针和near指针及far修饰符都是为了兼容的作用。没有实际意义。P表示这是一个指针,C表示是一个常量,T表示在Win32环境中,有一个_T宏,这个宏用来表示你的字符是否使用UNICODE, 如果你的程序定义了UNICODE或者其他相关的宏, 那么这个字符或者字符串将被作为UNICODE字符串, 否则就是标准的ANSI字符串。STR表示这个变量是一个字符串,所以LPCTSTR就表示一个指向常固定地址的可以根据一些宏定义改变语义的字符串。同样,LPCSTR就只能是一个ANSI字符串,在程序中我们大部分时间要使用带T的类型定义。

C++ LPCTSTR  -> Delphi  const PChar;

参考:

  1. delphi中关于LPCTSTR,LPTSTR,CSTRING,CHAR *等等的区别
    http://www.websnap123.com/show-TnpJNU56TXc=.html
  2. Data Type Mappings
    http://msdn.microsoft.com/en-us/library/se784sk6(vs.71).aspx
  3. 如何理解LPCTSTR类型?
    http://archlord.blog.hexun.com/7293951_d.html
Technorati 标签: , , , , , , ,

你可能感兴趣的:(String)