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

标签 c++ windows char sal lpwstr

我正在尝试寻找 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 的信息:

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

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定义代理对。)

NWPSTRLPWSTRPWSTR都是同义词,定义为 WCHAR指针,即同时考虑 __nullterminated SAL 注释,它们是指向“原始” C 风格的以 NUL 结尾的 Unicode UTF-16 字符串

基本上,这是与经典 C 的 char* 等效的 Windows Win32 Unicode。

多年来,我一直在使用 C++ 编写 Windows 程序,老实说,我从未遇到过这个 NWPSTR :)

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

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

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

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

并且,如果您在这些名称中放置一个 C,您将拥有只读 const 的类型定义> 对应物,例如:PCWSTRLPCWSTR 基本上是 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/

相关文章:

c++ - vector 错误,无法使 push_back 工作

c++ - 在销毁期间使用 std::shared_ptr 的 Segfault 可能是由于堆栈上的函数调用过多

c++ - find() 和 distance() 的准确度如何

c++ - 内存问题,不知道为什么。什么():std::bad_alloc

windows - 将位置更改为快捷方式位置

c++ - 在 Windows 中使用两只鼠标执行完全不同的操作

windows - 用于静默安装多个程序的批处理文件

static - 初始化静态const char *数组

c - 为什么 strchr 需要一个 int 来查找 char?

c - 字符数组末尾的意外字符 - C