我正在尝试找到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 的信息:
使用 SAL 注释减少 C/C++ 代码缺陷
WCHAR
在Windows平台SDK头中基本上被定义为wchar_t
的typedef,这是Microsoft Visual C++编译器中的16位字符类型。这被用作 Unicode UTF-16 编码的"字符单元",这是 Windows API 的默认事实上的 Unicode 编码。
请注意,其他编译器(如 Linux 上的 GNU GCC)认为wchar_t
是一个 32 位字符单元(不是 16 位),因此您必须注意代码的可移植性。
(注意:现代版本的 Windows 支持具有所谓代理项对的 Unicode UTF-16,因此您可以让几个相邻的WCHAR
定义代理项对。
NWPSTR
,LPWSTR
和PWSTR
都是同义词,定义为指向WCHAR
的指针,即也考虑SAL注解__nullterminated
, 它们是指向"原始"C样式NUL终止的Unicode UTF-16字符串的指针。
基本上,这是Windows Win32 Unicode等同于经典C的char*
。
我已经在C++中编写Windows好几年了,老实说,我从来没有遇到过这种NWPSTR
:)
名称PWSTR
是使用以下元素构建的:
-
P
: 指针 -
W
:"宽",即WCHAR
/基于wchar_t
,即Unicode UTF-16 -
STR
: 字符串
因此,PWSTR
表示指向WCHAR
/wchar_t
字符串的指针,即Unicode UTF-16字符串,如上所述。
LPWSTR
只是同一事物的旧名称;最初的L
意思是"长",这可以追溯到"长指针"可以比"短"或"近"指针更远地访问内存的时代:)那些日子已经不复存在了。
而且,如果你在这些名称中加上一个C
,你就有只读const
对应项的typedefs,例如: PCWSTR
或LPCWSTR
基本上const wchar_t*
以NUL结尾的Unicode UTF-16字符串
你会发现PCWSTR
和较旧的等效LPCWSTR
在Windows头文件和Windows API文档中大量使用来表示Unicode UTF-16"输入"(即 const
) C 样式的 NUL 终止字符串。