刚使用MFC总能碰到很多稀奇古怪的符号LP***,LPC***,LPCT**之类的,不过用习惯了,也就不没什么问题了,
说白了也就是一些指针类型而已,但当让你自己写函数的时候,你或许就会迷茫,不知道在什么时候该用什么类型的指针。
本文就专门为你介绍各类型的含义和作用。
L 表示long指针
P 表示这是一个指针
C 表示是一个常量
T 表示在Win32环境中, 有一个_T宏
CString的含义就不用说了吧?
下面介绍下LPTSTR、LPCSTR、LPCTSTR、LPSTR的意义:
LPSTR:32bit指针 指向一个字符串,每个字符占1字节
LPCSTR:32-bit指针 指向一个常字符串,每个字符占1字节
LPCTSTR:32-bit指针 指向一个常字符串,每字符可能占1字节或2字节,取决于Unicode是否定义
LPTSTR:32-bit指针 每字符可能占1字节或2字节,取决于Unicode是否定义
也就是说LPCSTR跟LPCTSTR只是支不支持Unicode的区别而已,其他功能都类似。
CString 和 LPCTSTR 基本可以通用,这就是C++的重载的作用之一……
但是 LPTSTR又不同了,他是 char*,意味着你随时可能修改里面的数据,这就需要内存管理了(如字符串变长,原来的存贮空间就不够了,则需要重新调整分配内存)。
所以 不能随便的将 const char* 强制转换成 char* 使用。
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;
LPCTSTR,LPTSTR,CString主要是应用场合不同:
-需要对字符串作复杂处理,用CString合适;
-函数参数需要调用某字符串值而不需改变它,用LPCTSTR合适;
例如定义函数 OpenMyFile(LPCTSTR FileName)
-函数参数需要调用某字符串值而在函数中可能改变,用&CString;
例如定义函数 GetMyName(CString &strMyName)
-函数参数需要调用某指向字符串的非常数指针,用LPTSTR和
CString的GetBuffer合适。例如函数 DoSomeThing(char *pSome),
调用时可以用
CString Str1(_T"asdfasdf"); //可以用Str1作些查找、替换的活
LPTSTR pMyVal=Str1.GetBuffer(-1);
DoSomeThing(pMyVal);
Str1.ReleaseBuffer();
用下面这个函数可以看看几种类型的使用。有些东西例如暂时变量释放引
起指针指向值的变化、字符串空间申请与释放还得啃MSDN
CString ChangeStr(LPCTSTR pcstr, LPTSTR pstr,CString str,CString &str_ref)
{
CString tempstr;
tempstr=pcstr; pcstr=_T("asdf");
tempstr=pstr; pstr=_T("asdf");
tempstr=str; str=_T("asdf");
tempstr=str_ref; str_ref=_T("asdf");
return tempstr;
}
void teststr()
{
LPCTSTR pcStr=_T("generic data1");
LPTSTR pStr=_T("generic data2");
CString Str=_T("generic data3");
CString Str1=_T("generic data4");
CString Str2;
pcStr=_T("generic data01");
pStr=_T("generic data02");
Str=_T("generic data03");
Str2=ChangeStr(pcStr,pStr,Str,Str1);
pcStr=Str;
pStr=Str.GetBuffer();
}