cstring ,std::string,lPCWSTR,_T,L()等彻底梳理

转自:http://blog.csdn.net/txdb/article/details/7298502

vc中的字符串类型真是眼花缭乱。

下面来google下。

整理如下:

c中只有字符数组,字符数组如果以\0结尾,就是字符串

c++中有字符串类型string,string接收字符数组,string要通过方法c_str()转换才能赋值给字符数组。

这个世界本来挺简单的。

Cstring 只有mfc中才有。对mfc不喜欢,直接略过。总觉得mfc把简单的问题搞复杂。

LPTSTR、LPCSTR、LPCTSTR、LPSTR的意义:

LPSTR:32bit指针 指向一个字符串,每个字符占1字节

LPCSTR:32-bit指针 指向一个字符串,每个字符占1字节
LPCTSTR:32-bit指针 指向一个常字符串,每字符可能占1字节或2字节,取决于Unicode是否定义
LPTSTR:32-bit指针 每字符可能占1字节或2字节,取决于Unicode是否定义

这些操作的都是指向字符数组。

 

经常看到_T,

T是非常有意思的一个符号(TCHAR、LPCTSTR、LPTSTR、_T()、_TEXT()...),它表示使用一种中间类型,既不明确表示使用 MBCS,也不明确表示使用 UNICODE。那到底使用哪种字符集?编译的时候才决定.

unicode下_T就相当于_L

简单说加T就是不确定是1个字节还是2个字节。根据环境定。

LPSTR相当于char*。

WCHAR是2个字节的。根据定义WCHAR 和wchar_t是一样的

c太老了。所以一个字符串就有这么多的门道。

而win32 的api函数用的LPSTR等,实际上操作的都是char*。或者WCHAR*。一般都是定义2个函数,用宏来自动适应。

这些指针的定义可能是win32下独有的。函数间传递还是用string好。或者是wstring。好像basic_string 是支持T宏的。

不过string毕竟还只是一个指针,只有char数组才是真货。

下面搞个小例子,把edit中的内容在messagebox中显示出来。

TCHAR usrname[100],usrpass[100];
   GetDlgItemText(hDlg,IDC_EDIT_usrname,usrname,100);
   ::MessageBox(hDlg,usrname,(LPCWSTR)L"tips",MB_YESNOCANCEL);

一切其他类型都是浮云,各种其他类型接收TCHAR都是友好的(我想)。

然后要转换成string就是

std::basic_string<TCHAR> susrname,susrpass;
   susrname=usrname;
   susrpass=usrpass;

当然char不是不能接收中文的。。

 

关于string参数 ,还得说明下。最常见的string参数的写法是

doLogin(const std::string& usrname,const std::string& usrpass)

加了&,则传递的是地址,省去了copy。但是为了避免dologin中不小心对usrname的改动,影响函数外部。所以加个const,表示不能修改。const在编译的时候起作用。

让你编译通不过。

总得来说就是win32 api 要的是char,wchar,tchar。


你可能感兴趣的:(cstring ,std::string,lPCWSTR,_T,L()等彻底梳理)