Mis*_*tyD 1 c++ windows char sal lpwstr
我试图找到替代LPWSTR将项目移植到gcc.
typedef __nullterminated WCHAR *NWPSTR, *LPWSTR, *PWSTR;
Run Code Online (Sandbox Code Playgroud)
什么是null终止?如果我这样做的话会安全吗
typedef WCHAR *LPWSTR
Run Code Online (Sandbox Code Playgroud)
typedef __nullterminated WCHAR*NWPSTR,*LPWSTR,*PWSTR;
该__nullterminated部分是SAL注释.SAL是Microsoft特定的技术,用于注释函数参数,返回值,函数行为等,以帮助使用Visual Studio代码分析工具查找错误并减少C/C++代码缺陷.您可以在MSDN上阅读有关SAL的信息:
WCHARWindows平台SDK标头中定义的基本上是一个typedef wchar_t,它是Microsoft Visual C++编译器中的16位字符类型.这是作为一个"字符单位"为Unicode的UTF-16编码,这是默认的事实上的视窗的API的Unicode编码.
请注意,其他编译器(如Linux上的GNU GCC)认为wchar_t是32位字符单元(而不是 16位),因此您必须注意代码的可移植性.
(注意:现代版本的Windows支持具有所谓代理项对的 Unicode UTF-16 ,因此您可以使用几个相邻的WCHARs来定义代理项对.)
NWPSTR,LPWSTR并且PWSTR都是同义词,定义为指针,以WCHAR,即也在考虑__nullterminatedSAL注释,它们是指向"原始" C风格NUL结尾的Unicode UTF-16字符串.
基本上,这是经典C的Windows Win32 Unicode等价物char*.
我用C++编写Windows已经好几年了,NWPSTR老实说,我从来没有遇到过这个问题:)
该名称PWSTR使用以下元素构建:
P:指针W:"wide",即WCHAR/ wchar_t-based,即Unicode UTF-16STR:字符串因此,PWSTR表示指向WCHAR/ wchar_tstring 的指针,即Unicode UTF-16字符串,如上所述.
LPWSTR对于同样的事情来说只是一个古老的名字; 初始L意味着"长",并且可以追溯到有"长指针"可以访问比"短"或"近"指针更远的内存的时代:)那些日子已经不复存在了.
并且,如果你C在这些名称中加入了一个只有const对应的同义词,例如:PCWSTR或者LPCWSTR基本上是const wchar_t*NUL终止的Unicode UTF-16字符串.
您会发现PCWSTR,在Windows头文件和Windows API文档中LPCWSTR使用了较旧的等价物来表示Unicode UTF-16 "输入"(即const)C风格的NUL终止字符串.