您应该默认 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,否则nullptrNULL0是一回事。

为了让事情更加混乱,一些 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,或者将 NULLnullptr 交换。

【讨论】:

【参考方案2】:

为了迂腐,你不应该使用任何东西,而是使用HMENU hMenu = NULL;

nullptr 是 C++ 主义,仅在 C++11 中标准化,而 Win32 是早于此的 C API。

HMENU 是一个不透明的指针,和其他 Win32 句柄一样,所以NULL0 更合适。

也就是说,在该语句中使用NULL0nullptr 中的任何一个最终都会编译为相同的机器代码,并且工作方式相同。

【讨论】:

我会说这是不正确的。有问题的代码不调用 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++ 库,NULLnullptr 之间的区别开始变得重要。在 MFC(或任何 C++ 代码)中应首选使用 nullptr,以防止重载解析模糊。

以上是关于您应该默认 HMENU 为 nullptr 还是 0?的主要内容,如果未能解决你的问题,请参考以下文章

编译器生成的默认构造函数是否会将std :: array中的指针初始化为nullptr?

我应该让我的对象属性为空还是为每种类型使用 CLR 默认值?

使用显式定义的默认构造函数将 unique_ptr 的类内成员初始化程序设置为 nullptr 错误

我可以将 nullptr 转换为其他指针类型吗?

未知模板类型的默认值或零值

对于州下拉菜单,您是不是应该默认列出 CA 省份?