1

我正在尝试寻找 LPWSTR 的替代品来将项目移植到 gcc。

typedef __nullterminated WCHAR *NWPSTR, *LPWSTR, *PWSTR;

什么是空终止?如果我做这样的事情会安全吗:

typedef WCHAR   *LPWSTR 
4

1 回答 1

6

typedef __null 终止 WCHAR *NWPSTR, *LPWSTR, *PWSTR;

__nullterminated部分是一个SAL 注释。SAL 是 Microsoft 特定的技术,用于注释函数参数、返回值、函数行为等,以帮助使用 Visual Studio 代码分析工具查找错误并减少 C/C++ 代码缺陷。您可以在 MSDN 上阅读有关 SAL 的信息:

使用 SAL 注释减少 C/C++ 代码缺陷

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 字符串的指针。PWSTRWCHAR__nullterminated

基本上,这是经典 C 的 Windows Win32 Unicode 等价物char*

NWPSTR我用 C++ 编写 Windows 已经好几年了,老实说我从来没有遇到过这种情况 :)

该名称PWSTR是使用以下元素构建的:

  • P: 指针
  • W: "wide",即基于WCHAR/wchar_t的,即 Unicode UTF-16
  • STR: 细绳

因此,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

于 2015-01-28T23:34:17.923 回答