涉及 LPWSTR 的这个 typedef 意味着什么?

What does this typedef mean involving LPWSTR?

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

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

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

typedef WCHAR   *LPWSTR 

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

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

Using SAL Annotations to Reduce C/C++ Code Defects

WCHAR 在 Windows 平台 SDK header 中定义,基本上作为 wchar_t 的类型定义,它是Microsoft Visual C++ 编译器中的 16 位 字符类型。这用作 "character unit" Unicode UTF-16 编码,这是默认的 de facto Windows APIs.
的 Unicode 编码 请注意,Linux 上的 GNU GCC 等其他编译器将 wchar_t 视为 32 位 字符单元( 而非 16 -bit),所以这里要注意代码的可移植性。

(注意:Windows 的现代版本支持 Unicode UTF-16 和所谓的 代理对 ,所以你可以有一个 couple 的相邻 WCHAR 定义代理对。)

NWPSTRLPWSTRPWSTR 都是同义词,定义为 指向 WCHAR 的指针 ,即同时考虑 __nullterminated SAL 注释,它们是指向 [=133 的指针=] C-style NUL-terminated Unicode UTF-16 字符串.

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

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

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

  • P: 指针
  • W"wide",即基于WCHAR/wchar_t,即Unicode UTF-16
  • STR: 字符串

因此,PWSTR 表示指向 WCHAR/wchar_t 字符串的指针,即 Unicode UTF-16 字符串,如上所述。

LPWSTR 只是同一事物的旧名称;最初的 L 表示 "long",这可以追溯到 "long pointers"可以访问比 "short" 或 "near" 指针更远的内存:)那些日子已经不复存在了。

而且,如果你在这些名字中加入 C,你就有了 read-only const 的类型定义对应,例如:PCWSTRLPCWSTR基本上是const wchar_t* NUL-terminated Unicode UTF-16 字符串。

您会发现 PCWSTR 和较旧的等效项 LPCWSTR 在 Windows header 文件和 中使用了很多 148=] API 文档来表示 Unicode UTF-16 "input"(即 constC-style NUL-terminated 字符串.