WinAPI 中的 sz 和 pwsz 前缀

Posted

技术标签:

【中文标题】WinAPI 中的 sz 和 pwsz 前缀【英文标题】:sz and pwsz prefixes in WinAPI 【发布时间】:2013-04-07 17:17:20 【问题描述】:

我现在对 WinAPI 中用于 CHAR 字符串和 WCHAR 字符串的匈牙利符号前缀有点困惑。 当我们使用 CHAR 字符串时,通常会使用这样的前缀:

CHAR szString[] = "Hello";

我们有一个以零结尾的字符串 szString,所以一切都很好。 但是当我们使用 WCHAR 字符串时,通常会使用这样的前缀:

WCHAR pwszString[] = L"Hello";

它代表指向以零结尾的宽字符串的指针...但是我们的类型看起来不像这样。指向以零结尾的宽字符串的指针是 WCHAR** 或 PWSTR*。我错了吗? 为什么 CHAR 字符串是 sz,而 WCHAR 字符串是 pwsz 而不是 wsz?

【问题讨论】:

即使是匈牙利符号的发明者也说这是一个坏主意。我会忘记这一切的。 别出汗。名字只是一个名字。 与所有匈牙利符号一样,p(应用于数组,但暗示它是一个指针)的目的是误导和混淆未来的维护者。代码很难写,为什么要更容易阅读? @john:不。匈牙利符号的发明者被那些指责他“匈牙利系统”的人吓坏了,这是一个坏主意。 Simonyi 使用它的方式有很多令人喜欢的地方。 en.wikipedia.org/wiki/Hungarian_notation 【参考方案1】:

第二个例子具有误导性(尽管并不少见)。它应该是以下两者之一:

WCHAR wszString[] = L"Hello";
WCHAR *pwszString = L"Hello";

由于数组可以在大多数需要指针的上下文中使用,因此一些程序员对这种区别有点草率。

匈牙利语已经过时,但可以是useful when used well。

【讨论】:

哦,谢谢,这是我对 wsz 和 pwsz 的猜测之一:) 那么 WCHAR** 应该有什么前缀呢? WCHAR **ppwszString。请记住,现代匈牙利语不是关于编译器关心的底层类型,而是更多关于程序员需要了解的数据类型。这个问题真的不应该是“WCHAR** 的前缀是什么?”。 WCHAR** 可能只是一个指向单个字符的指针,在这种情况下,它将是 WCHAR **ppwch【参考方案2】:

CHAR szString[] 与 CHAR * szString 同义。两者都是指向字符串的指针。指向以零结尾的字符串的指针是 CHAR*,指向以零结尾的宽字符串的指针是 WCHAR*(不是 WCHAR**)。

现在,如果你想学究气,你可以(错误地)声称 CHAR[] 是“只是一个字符数组”,在这种情况下,“rgc”可能是正确的前缀。

【讨论】:

它们仅在作为函数参数出现时才是同义词。否则它们分别是一个 CHAR 数组和一个指向 CHAR 的指针。 请赐教。你觉得这两者有什么区别? @RobH,例如,拥有CHAR arrString[]CHAR * pString,您将得到sizeof(arrString)sizeof(pString) 的不同结果。 @RobH:数组和指针与任何两种不同的类型一样不同;恰好有一个从一个到另一个的标准转换。如前所述,它们有不同的尺寸。他们也以不同的方式参与重载决议。 有趣。在从 C 到 C++0x 的时间轴上,数组在什么时候不再是指针的语法糖?

以上是关于WinAPI 中的 sz 和 pwsz 前缀的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Win x64 上使用 WinAPI 正确安装虚拟打印机?

无法编译旧的 WIN32 WINAPI 程序

自定义函数中的 WINAPI BeginPaint 和 TextOut 多次调用

python---win32gui:winAPI操作

Win10深色主题——如何在WINAPI中使用?

WinAPI 中的加速器,带有 2 个字母键