您应该默认 HMENU 为 nullptr 还是 0?
Posted
技术标签:
【中文标题】您应该默认 HMENU 为 nullptr 还是 0?【英文标题】:Should you default HMENU to nullptr or 0? 【发布时间】:2021-03-06 09:38:25 【问题描述】:我不清楚。哪个是正确的?
HMENU hMenu = 0;
HMENU hMenu = nullptr;
?
【问题讨论】:
为什么不让编译器帮你解决:HMENU hMenu ;
@IInspectable 我可以将它与任何变量一起使用(在合理范围内)吗?
应该对任何原始类型都有效。此处详细说明了确切的规则:Initialization。规则比您预期的要复杂得多。简而言之,T t;
与 T t = T();
相同,除非它不是。我不知道什么时候会这样。
@IInspectable 谢谢。那行得通,但后来在相同的功能中,我再次拥有if (hMenu != 0)
。在这种情况下我不能使用
可以吗。if(hMenu)
足够了吗?
我可能会选择if(hMenu)
。 C++ 可以隐式转换指向bool
的指针,其中空指针计算为false
,任何非空指针计算为true
。如果您曾经用资源包装器(如WIL 的 RAII 类型)替换 hMenu
,代码仍然是正确的。这对于具有多个无效值的类型(例如 HANDLE
)特别有趣。
【参考方案1】:
Windows API 出现在 nullptr
之前。引入nullptr
的原因是编译器有时会混淆“零整数”和“空指针”。这通常是函数重载的问题。程序员也可能对“零整数”和“空指针”感到困惑。推荐使用nullptr
,否则nullptr
、NULL
和0
是一回事。
为了让事情更加混乱,一些 Windows 的空句柄是非零值。例如,当函数失败时,CreateFile
的返回值为 INVALID_FILE_HANDLE
。在这种情况下你必须写if(hfile != INVALID_FILE_HANDLE)success...
提出的论点是,如果您有写if(handle)
而不是if(handle != specific_null_handle)
的习惯,那么当specific_null_handle
不为零时,您最终会编写错误的代码。否则,就编译器而言,if(handle)
与 if(handle != nullptr)
的代码相同。
为了与 Windows API 保持一致,您应该写 NULL
,或者将 NULL
与 nullptr
交换。
【讨论】:
【参考方案2】:为了迂腐,你不应该使用任何东西,而是使用HMENU hMenu = NULL;
。
nullptr
是 C++ 主义,仅在 C++11 中标准化,而 Win32 是早于此的 C API。
HMENU
是一个不透明的指针,和其他 Win32 句柄一样,所以NULL
比0
更合适。
也就是说,在该语句中使用NULL
、0
或nullptr
中的任何一个最终都会编译为相同的机器代码,并且工作方式相同。
【讨论】:
我会说这是不正确的。有问题的代码不调用 Windows API。它在 C++ 代码中初始化一个变量。 nullptr 关键字表示空指针文字,提供到任何指针类型的空指针值的隐式转换。这是用空指针值初始化指针类型变量的标准 C++ 方法。 @IInspectable 另一方面when in Rome... 虽然我同意这最终是风格选择和个人偏好的问题。我的看法是,在nullptr
存在之前,Win32 API 已经定义并工作了几十年,并且直到今天仍然如此。将新代码编译为 C++ 时编写 nullptr
与将相同代码编译为纯 C 时编写 NULL
并不会改变 API、文档和现有代码都是始终使用 NULL
的 C 遗留代码这一事实,所以我发现这样做更一致。
有问题的应用是 MFC。但是我经常使用 nullptr。但是当变量是一个实际的指针时,这是有道理的。但是处理....此外,Visual Studio Assist 使用 0 标记我并希望我使用 nullptr。无论如何,我的应用程序是混合的。一些 CStringArray、一些向量等。当我学习新方法时,我会使用不同的东西。
@AndrewTruckle 只要您保持自己的代码一致,就没有错误的选择。 MFC 本身在其源代码、文档和官方示例中使用 NULL
而不是 nullptr
,但这可能是由于其 Win32 包装器的老化和薄弱,而不是深层设计/样式决定。
MFC 使用NULL
,因为这就是我们在 1992 年所拥有的一切。由于 MFC 是一个 C++ 库,NULL
和 nullptr
之间的区别开始变得重要。在 MFC(或任何 C++ 代码)中应首选使用 nullptr
,以防止重载解析模糊。以上是关于您应该默认 HMENU 为 nullptr 还是 0?的主要内容,如果未能解决你的问题,请参考以下文章
编译器生成的默认构造函数是否会将std :: array中的指针初始化为nullptr?
我应该让我的对象属性为空还是为每种类型使用 CLR 默认值?