LPCSTR,LPCTSTR和LPTSTR
LPCSTR
, LPCTSTR
和LPTSTR
什么区别?
为什么我们需要将string转换为LV
/ _ITEM
结构variablespszText
:
LV_DISPINFO dispinfo; dispinfo.item.pszText = LPTSTR((LPCTSTR)string);
回答你的问题的第一部分:
LPCSTR
是一个常量string
LPCTSTR
是一个const TCHAR
string,( TCHAR
是一个宽字符或字符取决于UNICODE是否在您的项目中定义)
LPTSTR
是一个(非const) TCHAR
string
这是一个很棒的codeproject文章,描述C ++string(比较不同types的图表,请参阅2/3的下载方式)
快速和肮脏:
LP ==长指针。 只是想指针或字符*
C =常量在这种情况下,我认为他们的意思是string是一个常量,而不是指针是常量。
STR是string
T代表宽字符或字符(TCHAR),具体取决于编译选项。
添加约翰和蒂姆的答案。
除非你正在编写Win98,否则在应用程序中应该使用6+个stringtypes中的两个
-
LPWSTR
-
LPCWSTR
其余的意图是支持ANSI平台或双编译。 那些今天不像以前那样有意义。
回答你的问题的第二部分,你需要做的事情
LV_DISPINFO dispinfo; dispinfo.item.pszText = LPTSTR((LPCTSTR)string);
因为MS的LVITEM
结构有一个LPTSTR
,即一个可变的 Tstring指针,而不是一个LPCTSTR
。 你在做什么
1)将string
(一个猜测的CString
)转换成一个LPCTSTR
(实际上意味着获取字符缓冲区的地址作为一个只读指针)
2)将该只读指针转换为一个可写指针,通过抛弃它的const
。
这取决于使用dispinfo
是否有可能你的ListView
调用最终试图通过pszText
写入 。 如果是的话,这是一个可能非常糟糕的事情:毕竟你得到一个只读指针,然后决定把它看作是可写的:也许有一个原因是只读的!
如果它是一个CString
你正在与你有select使用string.GetBuffer()
– 故意给你一个可写的LPTSTR
。 然后你必须记得调用ReleaseBuffer()
如果string改变。 或者您可以分配一个本地临时缓冲区,并将string复制到那里。
99%的时间这将是不必要的,把LPCTSTR
当作LPTSTR
可行的…但有一天,当你最不期待的时候…
8位AnsiStrings
-
char
:8位字符 – 底层C / C ++数据types -
CHAR
:char
别名 – Windows数据types -
LPSTR
:以CHAR
结尾的空string -
LPCSTR
:CHAR
常量以NULL结尾的string
16位UnicodeString
-
wchar_t
:16位字符 – C / C ++数据types的基础 -
WCHAR
:wchar_t
别名 – Windows数据types -
LPWSTR
:以WCHAR
结尾的空string -
LPCWSTR
:WCHAR
空字符结尾的常量string
取决于UNICODE
定义
-
TCHAR
:如果定义了UNICODE,则为WCHAR
别名; 否则CHAR
-
LPTSTR
:以TCHAR
结尾的空string -
LPCWSTR
:以TCHAR
常量以空字符结尾的string
所以
| Item | 8-bit | 16-bit | Varies | |-------------------|--------------|-------------|-----------------| | character | CHAR | WCHAR | TCHAR | | string | LPSTR | LPWSTR | LPTSTR | | string (const) | LPCSTR | LPCWSTR | LPCTSTR |