LPCSTR、长链反应堆及长链反应堆

LPCSTRLPCTSTRLPTSTR之间有什么区别?

为什么我们需要这样做来将字符串转换成 LV/_ITEM结构变量 pszText:

LV_DISPINFO dispinfo;
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);
201205 次浏览

速战速决:

LP = = Long Pointer 只要想想指针或者字符 *

C = Const,在这种情况下,我认为它们的意思是字符串是一个 const,而不是指针是 const。

STR绳子

T用于宽字符或字符(TCHAR) ,具体取决于编译器选项。

额外阅读

来自 LPTSTR 中的字母“ T”代表什么?: < a href = “ https://archive. ph/3lqLY”rel = “ nofollow norefrer”> archive

LPTSTR 中的字母“ T”代表什么?

2006年10月17日

LPTSTR 中的“ T”来自 TCHAR 中的“ T”。我不知道确切的答案,但看起来很有可能是“短信”的意思。相比之下,WCHAR 中的“ W”可能来自 C 语言标准,它代表“ wide”。

回答你问题的第一部分:

LPCSTR是一个指向常量字符串的指针(LP 表示 长指针)

LPCTSTR是一个指向 const TCHAR字符串的指针(TCHAR是一个宽字符还是一个字符,取决于在项目中是否定义了 UnicODE)

LPTSTR是指向(非常数) TCHAR字符串的指针

实际上,在过去讨论这些问题时,为了简单起见,我们省略了“指向一个”短语,但是正如在轨道上的轻量级比赛所提到的,它们都是指针。

这是一个很好的描述 C + + 字符串的 代码项目文章代码项目文章(请参阅下面2/3的比较不同类型的图表)

增加了约翰和蒂姆的回答。

除非您正在为 Win98编写代码,否则应用程序中应该使用的6 + 字符串类型只有两种

  • LPWSTR
  • LPCWSTR

其余部分用于支持 ANSI 平台或双重编译。现在这些问题已经不像过去那么重要了。

要回答你问题的第二部分,你需要这样做

LV_DISPINFO dispinfo;
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);

因为 MS 的 LVITEM结构有一个 LPTSTR,也就是一个 易变的 T 字符串指针,而不是一个 LPCTSTR

1)将 string(一个猜测的 CString)转换成 LPCTSTR(实际上意味着获取其字符缓冲区的地址作为只读指针)

2)抛弃 const值,将只读指针转换为可写指针。

这取决于使用什么 dispinfo来决定是否有可能您的 ListView呼叫最终会试图通过该 pszText呼叫到 写作。如果出现这种情况,这可能是一件非常糟糕的事情: 毕竟,您得到了一个只读指针,然后决定将其视为可写的: 也许它是只读的是有原因的!

如果使用的是 CString,那么可以选择使用 string.GetBuffer()——这样就有意地提供了一个可写的 LPTSTR。然后,如果字符串确实发生了更改,您必须记住调用 ReleaseBuffer()。或者,您可以分配一个本地临时缓冲区并将字符串复制到其中。

99% 的情况下这是不必要的,把 LPCTSTR当作 LPTSTR来处理会有用的... ... 但是有一天,当你最不希望它发生的时候... ..。

8位 AnsiString

  • 8位字符 (底层 C/C + + 数据类型)
  • CHAR: 别名 char (Windows 数据类型)
  • 空终止字符串
  • 持续空终止字符串

16位 UnicodeString

  • 16位字符 (底层 C/C + + 数据类型)
  • WCHAR: 别名 wchar_t (Windows 数据类型)
  • 空终止字符串
  • 持续空终止字符串

取决于 UNICODE的定义

  • 如果定义了 UNICODE,则为 WCHAR的别名; 否则为 CHAR
  • 空终止字符串
  • 持续空终止字符串

所以:

物品 8位 (安西) 16位 (宽) 不一样
性格 CHAR WCHAR TCHAR
绳子 LPSTR LPWSTR LPTSTR
字符串(const) LPCSTR LPCWSTR LPCTSTR

额外阅读

TCHAR< em > Text Char (< a href = “ https://archive. fo/bWuoe”rel = “ norefrer”> archive. is )


为什么默认的8位代码页称为“ ANSI”?

来自 Unicode 和 Windows XP
作者: Cathy Wisink
Windows 全球化程序管理器
微软公司
二零零二年五月

尽管 Windows NT 3.1支持基本的 Unicode,但仍然支持代码页 对于包含在系统中的许多更高级别的应用程序和组件仍然是必需的,这解释了 Win32 API 的“ A”[ ANSI ]版本而不是“ W”[“ wide”或 Unicode ]版本的普遍使用。(用于表示 Windows 代码页的术语“ ANSI”是一个历史参考,但现在仍然是一个在 Windows 社区中持续存在的错误名称。其来源是 Windows 代码页1252最初是基于 ANSI 草案,后来成为 ISO 标准8859-1。然而,在增加代码指向为 ISO 标准中的控制代码保留的范围时,Windows 代码页1252和随后的 Windows 代码页最初基于 ISO 8859-x 系列偏离了 ISO。时至今日,微软内外的开发社区将8859-1代码页与 Windows 1252混为一谈并不罕见,还有“ ANSI”或“ A”用来表示对 Windows 代码页的支持

问题的第二部分的简短答案是,CString类没有提供设计上的直接类型转换,您所做的有点欺骗性。

一个更长的答案是:

之所以可以将 CString类型化为 LPCTSTR,是因为 CString 通过重写 operator=提供了这种功能。通过设计,它只提供对 LPCTSTR指针的转换,因此字符串值不能用此指针修改。

换句话说,它只是不提供一个重载 operator=来将 CString转换成 LPSTR,原因与上面相同。他们不希望以这种方式改变字符串值。

因此,本质上,诀窍是使用 CString 提供的操作符,并得到以下结果:

LPTSTR lptstr = (LPCTSTR) string; // CString provide this operator overload

现在 LPTSTR 可以进一步类型转换为 LPSTR:)

dispinfo.item.pszText = LPTSTR( lpfzfd); // accomplish the cheat :P

从‘ CString’中获取 LPTSTR的正确方法是这样的(完整的例子) :

CString str = _T("Hello");
LPTSTR lpstr = str.GetBuffer(str.GetAllocLength());
str.ReleaseBuffer(); // you must call this function if you change the string above with the pointer

同样,因为 GetBuffer ()返回 LPTSTR,所以现在您可以修改:)