我正在尝试寻找 LPWSTR 的替代品来将项目移植到 gcc。
typedef __nullterminated WCHAR *NWPSTR, *LPWSTR, *PWSTR;
什么是空终止?如果我这样做是安全的:
typedef WCHAR *LPWSTR
最佳答案
typedef __nullterminated WCHAR *NWPSTR, *LPWSTR, *PWSTR;
__nullterminated
部分是一个 SAL 注释。 SAL 是 Microsoft 的一项特定技术,用于注释函数参数、返回值、函数行为等,以帮助使用 Visual Studio 代码分析工具查找错误并减少 C/C++ 代码缺陷。您可以在 MSDN 上阅读有关 SAL 的信息:
WCHAR
在 Windows 平台 SDK header 中基本上定义为 wchar_t
的类型定义,它是 16 位 Microsoft Visual C++ 编译器中的字符类型。这用作Unicode UTF-16 编码的“字符单元”,这是Windows API 的默认事实上 Unicode 编码。
请注意,其他编译器(如 Linux 上的 GNU GCC)将 wchar_t
视为 32 位 字符单元(不是 16 位),因此您有这里要注意代码的可移植性。
(注意:现代版本的 Windows 支持 Unicode UTF-16 和所谓的代理对,因此您可以一对相邻的 WCHAR
定义代理对。)
NWPSTR
、LPWSTR
和 PWSTR
都是同义词,定义为 WCHAR
的指针,即同时考虑 __nullterminated
SAL 注释,它们是指向“原始” C 风格的以 NUL 结尾的 Unicode UTF-16 字符串。
基本上,这是与经典 C 的 char*
等效的 Windows Win32 Unicode。
多年来,我一直在使用 C++ 编写 Windows 程序,老实说,我从未遇到过这个 NWPSTR
:)
名称 PWSTR
是使用以下元素构建的:
P
:指针W
:“宽”,即基于WCHAR
/wchar_t
,即Unicode UTF-16STR
: 字符串
因此,PWSTR
表示指向 WCHAR
/wchar_t
字符串的指针,即 Unicode UTF-16 字符串,如上所述。
LPWSTR
只是同一事物的旧名称;最初的 L
表示 “长”,这可以追溯到 “长指针” 的时代,它可以访问比“更远的内存” short"或 "near"指针 :) 那些日子已经一去不复返了。
并且,如果您在这些名称中放置一个 C
,您将拥有只读 const
的类型定义> 对应物,例如:PCWSTR
或 LPCWSTR
基本上是 const wchar_t*
以 NUL 结尾的 Unicode UTF-16 字符串。
您会发现 PCWSTR
和旧版本的 LPCWSTR
在 Windows 头文件和 Windows API 文档中大量用于表示 Unicode UTF-16 “输入”(即 const
)C 风格以 NUL 结尾的字符串。
关于c++ - 涉及 LPWSTR 的这个 typedef 意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28204160/