我正在尝试找到LPWSTR的替代品,以便将项目移植到gcc。
typedef __nullterminated WCHAR *NWPSTR, *LPWSTR, *PWSTR;
什么是null终止?如果我这样做的话会安全吗:
typedef WCHAR *LPWSTR
答案 0 :(得分:5)
typedef __nullterminated WCHAR * NWPSTR,* LPWSTR,* PWSTR;
__nullterminated
部分是 SAL注释。 SAL是Microsoft特定的技术,用于注释函数参数,返回值,函数行为等,以帮助使用Visual Studio代码分析工具查找错误并减少C / C ++代码缺陷。您可以在MSDN上阅读有关SAL的信息:
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终止字符串。