C ++:将C函数的返回值与NULL或nullptr进行比较?

时间:2014-09-03 17:46:25

标签: c++ null nullptr

我在C ++中编码,并使用在失败的情况下返回NULL的C函数。什么是正确的想法,将其返回值与NULL或nullptr进行比较?

if ((CreateEventEx(myEventHandleHere) == NULL)
{
    ...
}

if ((CreateEventEx(myEventHandleHere) == nullptr)
{
    ...
}

4 个答案:

答案 0 :(得分:5)

附录C.4 C标准库中的draft C++ standard非规范性说:

  

宏NULL,在< clocale>,< cstddef>,< cstdio>中的任何一个中定义,   < cstdlib>,< cstring>,< ctime>或< cwchar>,是一个   本国际实现定义的C ++空指针常量   标准(18.2)。

相应的规范部分同意例如18.2说:

  

宏NULL是一个实现定义的C ++空指针常量   在本国际标准(4.10).194

这意味着如果您使用这些特定标头NULL应该与nullptr兼容,那么我只会使用nullptr

附录D中涉及兼容性似乎没有对.h标头文件做出类似声明,因此我们希望NULLnullptr兼容空指针常量如果它们不是从标准的角度来看,我们会感到惊讶,它似乎至少是不明确的。这使我们陷入两难境地,从实际角度来看,我们非常确定它们是兼容的,但我们没有足够的信息来证明它。

所以我会使用您正在使用的特定头文件定义的NULL,或者我们可以使用!= 0,因为幸运的是C99和C ++ 11告诉我们0是一个空指针常量

来自C99部分6.3.2.3 指针

  

值为0的整型常量表达式,或此类表达式   强制转换为void *,称为空指针常量.55)如果为null   指针常量被转换为指针类型,由此产生   指针,称为空指针,保证比较不等于a   指向任何对象或函数的指针。

  

任何指针类型都可以转换为整数类型。除了   之前指定的,结果是实现定义的

和C ++部分4.10 指针转换告诉我们:

  

空指针常量是一个整数文字(2.14.2),其值为零   或者类型为std :: nullptr_t的prvalue。空指针常量可以是   转换为指针类型;结果是空指针值   该类型并且可以与对象的每个其他值区分开来   指针或函数指针类型。[...]

答案 1 :(得分:2)

它们完全相同,所以使用nullptr因为NULL是一个原始的C-ism,没有理由再活下去了。

但是在CreateEventEx的情况下,你有一个非常热闹的奖励:并非所有无效的HANDLE都是nullptr,而其中一些是INVALID_HANDLE_VALUE。因此,在HANDLE的情况下,两者都不是真正的“安全”。您需要确切地检查CreateEventEx在失败时返回的内容。

答案 2 :(得分:0)

我会使用NULL,因为这是C使用的(同样,nullptr在C ++ 11中是新的,所以如果你不使用C ++ 11那么你必须使用{{ 1}})。另一方面,您可能无法明确地检查任何一个值,而是进行隐式比较,让编译器为您检查NULL

!= 0

您应该将值分配给变量,以便以后可以释放它(如果这是C API所需的那样):

if (CreateEventEx(myEventHandleHere))
{
    ...
}

答案 3 :(得分:-1)

如果函数返回NULL,我不确定为什么重要。这是一个实现细节。有许多旧的C ++函数返回NULL。许多新功能将返回nullptr。因此,如果您决定在自己的代码中为空指针值从NULL切换到nullptr,那么无论函数是否发生,您都应该保持一致。最初编写为C.当它被编译为C ++时,它就变成了C ++函数。

然而。在这种情况下,返回类型是HANDLEHANDLE实际上是void*的typedef这一事实是一个实现细节。 WinAPI文档说明,当HANDLE无效时,它与NULL相当。在这种情况下,我建议您使用WinAPI文档,并使用NULL。如果WinAPI没有使用typedef,只是将其所有函数记录为返回void*,那么如果在其余的C ++代码中使用nullptr,我会使用nullptr。 / p>