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 正确安装虚拟打印机?