你应该默认 HMENU 为 nullptr 还是 0?

问题描述

我不清楚。哪个是正确的?

  • HMENU hMenu = 0;
  • HMENU hMenu = nullptr;

解决方法

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,或者将 NULL 替换为 nullptr

,

为了迂腐,你应该两者都不使用,而是使用 HMENU hMenu = NULL;

  • nullptr 是一种 C++ 主义,仅在 C++11 中进行了标准化,而 Win32 是在此之前的 C API。

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

也就是说,在该语句中使用 NULL0nullptr 最终将编译为相同的机器代码,并以相同的方式工作。