我正在使用C++编程,并使用返回NULL的C函数来处理失败情况。应该怎么做,将其返回值与NULL或nullptr进行比较?
if ((CreateEventEx(myEventHandleHere) == NULL)
{
...
}
或者
if ((CreateEventEx(myEventHandleHere) == nullptr)
{
...
}
说明:本文介绍了空指针常量的定义和用法,空指针可用于表示一个无效的指向对象的指针。在C++中,空指针可以用0或nullptr来表示。空指针常量是一个整数字面值(2.14.2),其值为零,或者是std :: nullptr_t类型的prvalue。空指针常量可以转换为指针类型;结果是该类型的空指针值,并且与对象指针或函数指针类型的每个其他值不可区分。[...]
nullptr
,因为NULL
是一种原始的C语言习惯用法,没有理由继续存在。HANDLE
都是nullptr
,有些实际上是INVALID_HANDLE_VALUE
。因此,在HANDLE
的情况下,两者都不是真正的“安全”的。你需要检查CreateEventEx在失败时确切返回什么。<clocale>、<cstddef>、<cstdio>、<cstdlib>、<cstring>、<ctime>或<cwchar>
等文件等价,至少我没有找到适用于.h
文件的声明。最好情况下似乎存在歧义。 - Shafik Yaghmour我会使用 NULL
因为这是 C 语言所使用的(而且,nullptr
是 C++11 的新特性,如果你没有使用 C++11,那么你必须使用 NULL
)。另一方面,你可以不显式地检查任何一个值,而是进行隐式比较,让编译器为你检查 != 0
:
if (CreateEventEx(myEventHandleHere))
{
...
}
TypeName event = CreateEventEx(myEventHandleHere);
if (event)
{
...
free event when done...
}
我不确定函数返回NULL是否重要。这是一个实现细节。有许多旧的C++函数返回NULL。而许多新函数将返回nullptr
。因此,如果您决定在自己的代码中从NULL
切换到nullptr
以获取空指针值,则无论该函数最初是作为C编写的,都应始终如一。当它被编译为C++时,它就成为了一个C++函数。
然而,在这种情况下,返回类型是HANDLE
。事实上,HANDLE
实际上是void*
的typedef,这是一个实现细节。WinAPI文档说,当HANDLE
无效时,它可与NULL
进行比较。在这种情况下,我建议您遵循WinAPI文档,并使用NULL
。如果WinAPI没有使用typedefs,并且只记录所有函数返回void*
,则如果您在其余的C++代码中使用nullptr
,我会使用nullptr
。
NULL
,你应该将其返回值与NULL
进行比较。 - David Schwartzif (!CreateEventEx(myEventHandleHere))
,它甚至在英语中读起来也很好。 - Colander