我正在尝试寻找 LPWSTR 的替代品来将项目移植到 gcc。
typedef __nullterminated WCHAR *NWPSTR, *LPWSTR, *PWSTR;
什么是空终止?如果我做这样的事情会安全吗:
typedef WCHAR *LPWSTR
typedef __null 终止 WCHAR *NWPSTR, *LPWSTR, *PWSTR;
该__nullterminated
部分是一个SAL 注释。SAL 是 Microsoft 特定的技术,用于注释函数参数、返回值、函数行为等,以帮助使用 Visual Studio 代码分析工具查找错误并减少 C/C++ 代码缺陷。您可以在 MSDN 上阅读有关 SAL 的信息:
WCHAR
在 Windows 平台 SDK 标头中基本上定义为 typedef wchar_t
,它是 Microsoft Visual C++ 编译器中的16 位字符类型。这用作Unicode UTF-16编码的“字符单元”,这是 Windows API 的默认事实Unicode 编码。
请注意,Linux 上的 GNU GCC 等其他编译器认为是32 位字符单元(而不是16 位),因此您必须在此处注意代码的可移植性。wchar_t
(注意:现代版本的 Windows 支持 Unicode UTF-16 和所谓的代理对,因此您可以有几个相邻WCHAR
的 s 定义代理对。)
NWPSTR
和都是同义词,定义为LPWSTR
指向的指针,即也考虑SAL 注释,它们是指向“原始” C 样式 NUL 终止的 Unicode UTF-16 字符串的指针。PWSTR
WCHAR
__nullterminated
基本上,这是经典 C 的 Windows Win32 Unicode 等价物char*
。
NWPSTR
我用 C++ 编写 Windows 已经好几年了,老实说我从来没有遇到过这种情况 :)
该名称PWSTR
是使用以下元素构建的:
P
: 指针W
: "wide",即基于WCHAR
/wchar_t
的,即 Unicode UTF-16STR
: 细绳因此,PWSTR
表示指向WCHAR
/wchar_t
字符串的指针,即 Unicode UTF-16 字符串,如上所述。
LPWSTR
只是同一事物的旧名称;最初的L
意思是“长”,这可以追溯到有“长指针”的时代,它可以访问比“短”或“近”指针更远的内存:) 那些日子已经不复存在了。
而且,如果您C
在这些名称中输入 a,则您将拥有只读const
对应项的 typedef,例如:PCWSTR
或者LPCWSTR
基本上是以const wchar_t*
NUL 结尾的 Unicode UTF-16 字符串。
您会发现在 Windows 头文件和 Windows API 文档中使用了很多PCWSTR
旧版本来表示Unicode UTF-16 “输入”(即)C 风格的 NUL 终止字符串。LPCWSTR
const