not*_*ter 101 c++ windows mfc visual-c++
什么区别LPCSTR,LPCTSTR和LPTSTR?
为什么我们需要这样做才能将字符串转换为LV/ _ITEMstructure变量pszText:
LV_DISPINFO dispinfo;
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);
Run Code Online (Sandbox Code Playgroud)
Joh*_*bly 113
回答你问题的第一部分:
LPCSTR 是一个const字符串
LPCTSTR是一个const TCHAR字符串,(TCHAR根据是否在项目中定义了UNICODE,可以是宽字符或char)
LPTSTR是(非const)TCHAR字符串
这是一篇很棒的代码项目文章,描述了C++字符串(参见2/3,比较不同类型的图表的方式)
Tim*_*Tim 83
又快又脏:
LP== L ong P ointer.想想指针或字符*
C= C onst,在这种情况下,我认为它们意味着字符串是const,而不是指针是const.
STR是字符串
的T是用于根据编译选项宽字符或字符(TCHAR).
Ian*_*oyd 27
char:8位字符 - 基础C/C++数据类型CHAR:别名char- Windows数据类型LPSTR:以null结尾的字符串CHAR (L ong P ointer)LPCSTR:常量以null结尾的字符串CHAR (L ong P ointer)wchar_t:16位字符 - 基础C/C++数据类型WCHAR:别名wchar_t- Windows数据类型LPWSTR:以null结尾的字符串WCHAR (L ong P ointer)LPCWSTR:常量以null结尾的字符串WCHAR (L ong P ointer)UNICODE定义TCHAR:WCHAR如果定义了UNICODE的别名; 除此以外CHARLPTSTR:以null结尾的字符串TCHAR (L ong P ointer)LPCTSTR:常量以null结尾的字符串TCHAR (L ong P ointer)所以
| Item | 8-bit | 16-bit | Varies |
|-------------------|--------------|-------------|-----------------|
| character | CHAR | WCHAR | TCHAR |
| string | LPSTR | LPWSTR | LPTSTR |
| string (const) | LPCSTR | LPCWSTR | LPCTSTR |
Run Code Online (Sandbox Code Playgroud)
TCHAR→ 文字字符 (archive.is)
添加到约翰和蒂姆的答案。
除非您为 Win98 编码,否则您应该在应用程序中使用的 6 种以上字符串类型中只有两种
LPWSTRLPCWSTR其余的旨在支持 ANSI 平台或双重编译。这些在今天不像过去那样重要。
要回答问题的第二部分,您需要执行以下操作
LV_DISPINFO dispinfo;
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);
Run Code Online (Sandbox Code Playgroud)
因为 MS 的LVITEMstruct 有一个LPTSTR,即可变T 字符串指针,而不是LPCTSTR. 你正在做的是
1)将string(CString猜测的a)转换为an LPCTSTR(这实际上意味着将其字符缓冲区的地址作为只读指针获取)
2) 通过放弃其 -ness 将该只读指针转换为可写指针const。
这取决于dispinfo您的调用最终是否有机会ListView尝试写入该内容,这取决于所使用的内容pszText。如果确实如此,这可能是一件非常糟糕的事情:毕竟您获得了一个只读指针,然后决定将其视为可写:也许它是只读的是有原因的!
如果它是CString你正在使用的,你可以选择使用string.GetBuffer()- 这故意给你一个可写的LPTSTR。ReleaseBuffer()然后,如果字符串确实发生更改,您必须记住调用。或者您可以分配一个本地临时缓冲区并将字符串复制到其中。
99% 的情况下,这是不必要的,将其视为LPCTSTR可行LPTSTR......但有一天,当你最意想不到的时候......