我在C ++中编码,并使用在失败的情况下返回NULL的C函数。什么是正确的想法,将其返回值与NULL或nullptr进行比较?
if ((CreateEventEx(myEventHandleHere) == NULL)
{
...
}
或
if ((CreateEventEx(myEventHandleHere) == nullptr)
{
...
}
答案 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
标头文件做出类似声明,因此我们希望NULL
和nullptr
兼容空指针常量如果它们不是从标准的角度来看,我们会感到惊讶,它似乎至少是不明确的。这使我们陷入两难境地,从实际角度来看,我们非常确定它们是兼容的,但我们没有足够的信息来证明它。
所以我会使用您正在使用的特定头文件定义的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 ++函数。
然而。在这种情况下,返回类型是HANDLE
。 HANDLE
实际上是void*
的typedef这一事实是一个实现细节。 WinAPI文档说明,当HANDLE
无效时,它与NULL
相当。在这种情况下,我建议您使用WinAPI文档,并使用NULL
。如果WinAPI没有使用typedef,只是将其所有函数记录为返回void*
,那么如果在其余的C ++代码中使用nullptr
,我会使用nullptr
。 / p>