LPCTSTR类型 lpctstr cstring

LPCTSTR类型  如何理解LPCTSTR类型?  L表示long指针 这是为了兼容Windows 3.1等16位操作系统遗留下来的,在win32中以及其他的32位操作系统中,long指针和near指针及far修饰符都是为了兼容的作用。没有实际意义。  P表示这是一个指针  C表示是一个常量

  T表示在Win32环境中, 有一个_T宏

  这个宏用来表示你的字符是否使用UNICODE,如果你的程序定义了UNICODE或者其他相关的宏,那么这个字符或者字符串将被作为UNICODE字符串,否则就是标准的ANSI字符串。

LPCTSTR类型 lpctstr cstring
  STR表示这个变量是一个字符串  所以LPCTSTR就表示一个指向常固定地址的可以根据一些宏定义改变语义的字符串。  同样, LPCSTR就只能是一个ANSI字符串,在程序中我们大部分时间要使用带T的类型定义。   LPCTSTR == const TCHAR *  CString 和 LPCTSTR 可以说通用。原因在于CString定义的自动类型转换,没什么奇特的,最简单的C++操作符重载而已。  常量字符串ansi和unicode的区分是由宏_T来决定的。但是用_T("abcd")时,字符串"abcd"就会根据编译时的是否定一_UNICODE来决定是char* 还是 w_char*。 同样,TCHAR也是相同目的字符宏。 看看定义就明白了。简单起见,下面只介绍 ansi 的情况,unicode 可以类推。  ansi情况下,LPCTSTR 就是 const char*, 是常量字符串(不能修改的)。  而LPTSTR 就是 char*, 即普通字符串(非常量,可修改的)。  这两种都是基本类型, 而CString 是 C++类, 兼容这两种基本类型是最起码的任务了。  由于const char* 最简单(常量,不涉及内存变更,操作迅速), CString 直接定义了一个类型转换函数  operator LPCTSTR() {......}, 直接返回他所维护的字符串。  当你需要一个const char* 而传入了CString时, C++编译器自动调用 CString重载的操作符LPCTSTR()来进行隐式的类型转换。  当需要CString , 而传入了 const char* 时(其实 char*也可以),C++编译器则自动调用CString的构造函数来构造临时的 CString对象。  因此CString 和 LPCTSTR 基本可以通用。  但是 LPTSTR又不同了,他是 char*,意味着你随时可能修改里面的数据,这就需要内存管理了(如字符串变长,原来的存贮空间就不够了,则需要重新调整分配内存)。  所以 不能随便的将 const char* 强制转换成 char* 使用。  楼主举的例子  LPSTR lpstr = (LPSTR)(LPCTSTR)string;  就是这种不安全的使用方法。  这个地方使用的是强制类型转换,你都强制转换了,C++编译器当然不会拒绝你,但同时他也认为你确实知道自己要做的是什么。因此是不会给出警告的。  强制的任意类型转换是C(++)的一项强大之处,但也是一大弊端。这一问题在 vc6以后的版本(仅针对vc而言)中得到逐步的改进(你需要更明确的类型转换声明)。  其实在很多地方都可以看到类似  LPSTR lpstr = (LPSTR)(LPCTSTR)string;  地用法,这种情况一般是函数的约束定义不够完善的原因,比如一个函数接受一个字符串参数的输入,里面对该字符串又没有任何的修改,那么该参数就应该定义成 const char*,但是很多初学者弄不清const地用法,或者是懒, 总之就是随意写成了 char* 。 这样子传入CString时就需要强制的转换一下。  这种做法是不安全的,也是不被建议的用法,你必须完全明白、确认该字符串没有被修改。  CString 转换到 LPTSTR (char*),预定的做法是调用CString的GetBuffer函数,使用完毕之后一般都要再调用ReleaseBuffer函数来确认修改(某些情况下也有不调用ReleaseBuffer的,同样你需要非常明确为什么这么做时才能这样子处理,一般应用环境可以不考虑这种情况)。  同时需要注意的是, 在GetBuffer 和ReleaseBuffer之间,CString分配了内存交由你来处理,因此不能再调用其他的CString函数。  CString 转LPCTSTR:  CString cStr;  const char *lpctStr=(LPCTSTR)cStr;  LPCTSTR转CString:  LPCTSTR lpctStr;  CString cStr=lpctStr;

  

爱华网本文地址 » http://www.413yy.cn/a/25101016/304753.html

更多阅读

sim卡有哪几种类型 中国移动sim卡种类

sim卡有哪几种类型——简介sim卡是手机中必须装的卡,没有sim卡的手机就不再是手机了。到目前为止(现在是2014年)随着手机的需求,SIM卡也发展到了三种类型。sim卡有哪几种类型——工具/原料头脑思维sim卡有哪几种类型——方法/步骤sim卡

拉取验证类型失败 域名验证类型

拉取验证类型失败——简介最近加别人QQ时一直出现【拉取验证类型失败】,有人说是因为短时间内加人太多导致的,但是我最近一直没有加好友。拉取验证类型失败——工具/原料电脑,QQ拉取验证类型失败——方法/步骤拉取验证类型失败 1、加

matlab的使用:8 如何画不同类型的三维图像

matlab的使用:[8]如何画不同类型的三维图像——简介这是本系列经验的第八篇,主要介绍用matlab软件画三维图像的一些相关函数,使用这些函数可以很方便的画出想要的图形,非常直观好用。matlab的使用:[8]如何画不同类型的三维图像——工具/

男士烫发的5种类型 男士烫发发型图片2016

男生发型一般很少有特定的名字,不过今天为大家整理了一些男生烫发,让大家来学习和辨别下。男士烫发的5种类型——步骤/方法男士烫发的5种类型 1、时尚男生定位烫发型效果定位烫发型比较自然,此款发主要强调刘海线条的俐落感展现出男

如何设置手机的首选网络类型? 电信设置首选网络类型

如何设置手机的首选网络类型?——简介 大家都知道,手机网络有2G、3G等等之分,又有联通、移动、电信三种制式, 一般系统默认的设置为3G优先,在这种模式下,手机可能频繁的切换网络,一会儿跳到2G一会儿又跳到3G,这样子的话不仅增加了耗电量,同时

声明:《LPCTSTR类型 lpctstr cstring》为网友紫色风铃分享!如侵犯到您的合法权益请联系我们删除