这种typedef涉及LPWSTR的含义是什么?

时间:2015-01-28 23:08:26

标签: c++ windows char sal lpwstr

我正在尝试找到LPWSTR的替代品,以便将项目移植到gcc。

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

什么是null终止?如果我这样做的话会安全吗:

typedef WCHAR   *LPWSTR 

1 个答案:

答案 0 :(得分:5)

  

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

Windows平台SDK标头中

WCHAR 基本上定义为wchar_t的typedef,这是 16位字符类型Microsoft Visual C ++编译器。这用作"字符单元" 用于 Unicode UTF-16 编码,这是默认的事实上的 Unicode Windows API的编码 请注意,其他编译器(如Linux上的GNU GCC)认为wchar_t 32位字符单元(不是 16位),所以你必须注意这里是为了代码的可移植性。

(注意:现代版本的Windows支持带有所谓代理项对的Unicode UTF-16,因此您可以拥有相邻WCHAR个的情侣定义代理对。)

NWPSTR LPWSTR PWSTR 都是同义词,定义为指针WCHAR,即考虑__nullterminated SAL注释,它们指向" raw" C-style NUL终止的Unicode UTF-16字符串

基本上,这是Windows Win32 Unicode等同于经典C&#39 {s} {/ 1}}。

我用C ++编写Windows已经好几年了,说实话,我从未见过这个char*。)

名称NWPSTR使用以下元素构建:

  • PWSTR:指针
  • P" wide" ,即基于W / WCHAR,即Unicode UTF-16
  • wchar_t:string

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

wchar_t只是同一件事的旧名称;最初的LPWSTR表示" long" ,这可以追溯到"长指针" 的时间它可以访问更远的存储空间"短"或者"附近"指针:)那些日子不复存在了。

而且,如果您在这些名称中添加了 L ,则只有 C 对应的typedef,例如:< strong> const PCWSTR 基本上是 LPCWSTR NUL终止的Unicode UTF-16字符串。

您会在Windows头文件和Windows API文档中找到const wchar_t*和旧的等效PCWSTR 很多来表示 Unicode UTF-16 &#34;输入&#34; (即LPCWSTR C风格的NUL终止字符串