这个 typedef 涉及 LPWSTR 是啥意思?
Posted
技术标签:
【中文标题】这个 typedef 涉及 LPWSTR 是啥意思?【英文标题】:What does this typedef mean involving LPWSTR?这个 typedef 涉及 LPWSTR 是什么意思? 【发布时间】:2015-01-28 23:08:26 【问题描述】:我正在尝试寻找 LPWSTR 的替代品来将项目移植到 gcc。
typedef __nullterminated WCHAR *NWPSTR, *LPWSTR, *PWSTR;
什么是空终止?如果我做这样的事情会安全吗:
typedef WCHAR *LPWSTR
【问题讨论】:
见:***.com/questions/11648246/compiler-error-in-dev-c。接受的答案稍微谈到了这些符号。__nullterminated
看起来像是特定于编译器的扩展。在任何情况下,LPWSTR
只是一个指向宽字符的指针(目的是该字符是字符数组中的第一个字符,以空字符结尾,从而形成一个字符串)。您的 typedef 很好(尽管它缺少分号)。
所以typedef WCHAR *LPWSTR
可以作为替代品?
@Misty:是的。你的阅读速度比我忍者编辑我的评论要快 :-) 如果你在 Windows 上使用 GCC,那么在某个地方应该已经有一个标题来定义这些类型。 (例如,MinGW 有自己的 windows.h
版本。)
我正在使用 cygwin-gcc
【参考方案1】:
typedef __null 终止 WCHAR *NWPSTR, *LPWSTR, *PWSTR;
__nullterminated
部分是SAL 注释。 SAL 是 Microsoft 特定的技术,用于注释函数参数、返回值、函数行为等,以帮助使用 Visual Studio 代码分析工具查找错误并减少 C/C++ 代码缺陷。您可以在 MSDN 上阅读有关 SAL 的信息:
Using SAL Annotations to Reduce C/C++ Code Defects
WCHAR
在 Windows 平台 SDK 标头中基本上定义为 wchar_t
的 typedef,它是 Microsoft Visual C++ 中的 16 位 字符类型编译器。这用作 Unicode UTF-16 编码的“字符单元”,这是 Windows API 的默认 de facto Unicode 编码。
请注意,Linux 上的 GNU GCC 等其他编译器将 wchar_t
视为 32 位 字符单元(不是 16 位),因此您必须注意这里代码的可移植性。
(注意:现代版本的 Windows 支持 Unicode UTF-16 以及所谓的代理对,因此您可以有一对相邻的WCHAR
s 的对定义一个代理对。)
NWPSTR
、LPWSTR
和 PWSTR
都是同义词,定义为 指针 WCHAR
,即同时考虑__nullterminated
SAL 注释,它们是指向“raw” C 风格NUL 终止的Unicode UTF-16 字符串。
基本上,这是 Windows Win32 Unicode 等价于经典 C 的char*
。
我用 C++ 编写 Windows 已经好几年了,老实说,我从来没有遇到过这个 NWPSTR
:)
名称PWSTR
是使用以下元素构建的:
P
:指针
W
:"wide",即WCHAR
/wchar_t
-based,即Unicode UTF-16
STR
: 字符串
因此,PWSTR
表示指向 WCHAR
/wchar_t
字符串的指针,即 Unicode UTF-16 字符串,如上所述。
LPWSTR
只是同一事物的旧名称;最初的L
表示“长”,这可以追溯到存在“长指针” 可以访问比“短”或“近”更远的内存的时代" 指针 :) 那些日子已经不复存在了。
而且,如果您在这些名称中添加 C
,您将拥有只读 const
对应项的类型定义,例如:@987654347 @ 或 LPCWSTR
基本上是 const wchar_t*
以 NUL 结尾的 Unicode UTF-16 字符串。
您会发现 PCWSTR
和较旧的等效 LPCWSTR
在 Windows 头文件和 Windows API 文档中使用很多来表示 Unicode UTF-16 “输入”(即const
)C 风格的以 NUL 结尾的字符串。
【讨论】:
以上是关于这个 typedef 涉及 LPWSTR 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章
这个声明是啥 typedef void foo();意思是? [关闭]
“typedef __u16 __bitwise __le16;”是啥意思?在Linux内核中是啥意思?