首页 > 编程知识 正文

MFC LPCTSTR

时间:2023-05-03 18:25:45 阅读:210959 作者:973

转载于:SomebodyLuo的LPCTSTR和CString的关系

LPCTSTR类型类型理解:
  L——表示long指针,这是为了兼容Windows 3.1等16位操作系统遗留下来的。在win16下有长指针(LP)和短指针(P)的区别,在win32中以及其他的32位操作系统中, long 指针和 near 指针及 far 修饰符都是为了兼容的作用,没有实际意义。
  P——表示这是一个指针
  C——表示是一个常量
  T——表示在Win32环境中, 有一个_T宏
  STR——表示这个变量是一个字符串

 _T 这个宏用来表示字符是否使用 UNICODE,如果程序中定义了 UNICODE,那么这个字符或者字符串将被作为UNICODE字符串,否则就是 ANSI 字符串。

拓展:

UNICODE和ANSI是两种不同的编码方式标准,ANSI中的字符采用8 bit,而UNICODE中的字符采用16 bit。对于字符来说,ANSI以单字节存放英文字符,以双字节存放中文等字符;而Unicode下,英文和中文的字符都以双字节存放。8 bit 的ANSI 编码只能表示256种字符,表示 26 个英文字母是绰绰有余的,但是表示汉字,韩国语等有着成千上万个字符的非西方字符肯定就不够了,正是如此才引入了UNICODE标准。

CString 和 LPCTSTR 可以说是通用的, 原因在于CString通过C++操作符重载定义了自动类型转换
  常量字符串 ANSI 和 UNICODE 的区分是由宏_T来决定的。但是用_T("abcd")时, 字符串"abcd"就会根据编译时的是否定一_UNICODE来决定是char* 还是 w_char*。 同样,TCHAR 也是相同目的字符宏。 看看定义就明白了。
  简单起见,下面只介绍 ANSI 的情况,UNICODE 可以类推。

ANSI 情况下

LPCTSTR 就是 const char*,是常量字符串(不能修改的)。

LPTSTR 就是 char*, 即普通字符串(非常量,可修改的)。

这两种都是基本类型,由于const char* 最简单(常量,不涉及内存变更,操作迅速), CString 直接定义了一个类型转换函数,直接返回所维护的字符串。

operator LPCTSTR(){  } 当需要一个const char * 而传入了CString时, C++编译器自动调用 CString重载的操作符 LPCTSTR()来进行隐式的类型转换。当需要CString ,而传入了 const char * 时(其实 char* 也可以),C++编译器则自动调用CString的构造函数来构造临时的 CString对象。

 因此CString 和 LPCTSTR 基本可以通用。

LPTSTR与char *

由于是 char *, 意味着随时可能修改里面的数据,就需要内存管理了(如字符串变长,原来的存贮空间就不够了,则需要重新调整分配内存)。所以 不能随便的将 const char* 强制转换成 char * 使用。例如:

LPSTR lpstr = (LPSTR)(LPCTSTR)string;

在很多地方都可以看到类似 LPSTR lpstr = (LPSTR)(LPCTSTR) string的用法,这种情况一般是函数的约束定义不够完善的原因, 比如一个函数接受一个字符串参数的输入,里面对该字符串又没有任何的修改,那么该参数就应该定义成 const char*, 但是很多初学者弄不清 const 的用法,或者是懒, 总之就是随意写成了 char* 。 这样子传入CString时就需要强制的转换一下。这种做法是不安全的,也是不被建议的用法,你必须完全明白、确认该字符串没有被修改。

CString 转换到 LPTSTR (char*):

CString 转换到 LPTSTR (char*), 预定的做法是调用CString的GetBuffer函数,使用完毕之后一般都要再调ReleaseBuffer函数来确认修改 (某些情况下也有不调用ReleaseBuffer的,同样你需要非常明确为什么这么做时才能这样子处理,一般应用环境可以不考虑这种情况)。

同时需要注意的是, 在GetBuffer 和 ReleaseBuffer之间,CString分配了内存交由你来处理,因此不能再调用其他的CString函数。

未完待续

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。