CString和LPCTSTR之间的关系和区别

在Windows操作系统中,我们常用2种编码格式,ANSI编码和Unicode编码

ANSI => 窄字节编码, 一个字符(char)占用一个字节(一个字节占8位)的存储空间, 也就是说一个字符占据8位(有效数据是除掉最高位的其他7位) => C++中用char来表示这种窄字节编码的字符

Unicode => 宽字节编码, 一个字符(wchar_t)占用2个字节(一个字节占8位)的存储空间, 也就是说一个字符占据16位 => C++中用wchar_t来表示这种宽字节编码的字符

 我们在写C++代码时,尽量使用Unicode宽字节编码 (开发程序时使用Unicode(类型为wchar_t)是一种被鼓励的做法). 因为Windows 2000 及其以后的 Xp、2003、Vista、Win7 等系统都是使用Unicode从头进行开发的,如果调用任何一个Windows API 函数并给它传递一个 ANSI 字符串,那么系统首先要将字符串转换成Unicode,然后将Unicode字符串传递给操作系统。如果希望函数返回ANSI字符串,系统就会先将Unicode字符串转换成ANSI字符串,然后将结果返回给你的应用程序。进行这些字符串的转换需要占用系统的时间和内存。

在C++代码中,有时为了实现两种编码的通用,又定义了一个叫做TCHAR的类型

如果定义_UNICODE, 则声明如下
typedef wchar_t TCHAR;

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

CString就是一个动态的TCHAR数组, 这个数组里面的字符被声明为TCHAR类型, 它是一个完全独立的类,封装了+等操作符和字符串操作方法等供用户方便的使用

然后我们来看 LPCTSTR

LP  => long pointer,  长指针这个概念,是在以前的win16下存在的,win16下有长指针和短指针的区别. 但是在win32下面,是没有这个区别的,就是指针,所以对于win32而言,LP(long pointer)和P(pointer)是等价的,一样的.

C => const, 常量。 表明这种数据类型的实例不能被使用它的API函数改变.

T => 就是我们上面说的TCHAR,  在采用Unicode方式编译时是wchar_t, 在采用ANSI窄字节编码编译时,是char

STR => 就是string, 表示是字符串

所以总结下来

LPSTR => 它表示一个指向以 '\0'结尾的ANSI字符数组的指针,  等同于char*, 与char*可以互换使用

LPCSTR => 和LPSTR唯一的区别就是,增加了一个C,表示const 常量, 来表明这种数据类型的实例不能被使用它的API函数改变

LPWSTR => 这里的W代表的就是宽字节编码16位的wchar_t, 也就是说指针指向的是采用wchar_t宽字节编码的字符数组(字符串)

LPCWSTR => 和上面一样,就是增加了个C, 表示const常量

LPTSTR => 表示一个指向字符数组的指针,其中的每个字符都是上面说到的TCHAR类型

LPCTSTR => 和上面一样,就是增加了个C, 来表示const常量,来表明这种数据类型的实例不能被使用它的API函数改变

 

posted on 2023-10-09 14:29  新西兰程序员  阅读(163)  评论(0编辑  收藏  举报