17

如今,使用 C++11,推荐使用什么,Zero或者NULL?如果是第二个中的第一个?

int * p = getPointer();

if( 0 == p ){
    // something
}

if( NULL == p ){
    // something
}

更新:我忘记了新的

if( nullptr == p ){
    // something
}

更新2:示例是显示写入空指针的选项,我知道写起来更愉快if( !p )

4

4 回答 4

30

也不是,是nullptr

不过,在你的情况下,我会选择

if ( !p ){
   //something
}

2.14.7 指针文字 [lex.nullptr]

1 指针文字是关键字nullptr。它是类型的prvalue std::nullptr_t。[注意:std::nullptr_t 是一种独特的类型,既不是指针类型也不是指向成员类型的指针;相反,这种类型的纯右值是一个空指针常量,可以转换为空指针值或空成员指针值。

于 2012-10-26T17:43:52.440 回答
29

其他答案都是对的。但我想多说一点为什么 nullptr更好。

在 C++11 中,“完美转发”非常重要。它无处不在。明显的地方是bindfunction。但它也被用于许多其他地方。但是“完美转发”并不完美。它失败的地方之一是空指针常量。

template <class T>
void display(T)
{
    std::cout << type_name<T>() << '\n';
}

template <class T>
void
f(T&& t)
{
    display(std::forward<T>(t));  // "perfectly forward" T
}

int main()
{
    f(0);
    f(NULL);
    f(nullptr);
}

使用适当的定义type_name<T>(),在我的系统上会打印出:

int
long
std::nullptr_t

这很容易区分工作代码和错误。运气好的话,您的错误将在编译时出现(带有可怕的错误消息)。但在某些情况下,您也可能会遇到运行时错误。

积极禁止在代码中使用 0 和 NULL。

即使您在代码中没有完美的转发,您调用的代码(例如 std::lib)也很可能在幕后使用它。

于 2012-10-26T18:08:23.070 回答
12

C++11 有一个新的文字关键字nullptr。它比这样的事情更好0NULL因为它不可能被用作int重载决议。

if ( nullptr == p )

或者当然你可以在 bool 上下文中使用指针:

if ( !p )
于 2012-10-26T17:46:04.083 回答
0

如果您在 2019 年遇到同样的问题,您正在为未分配的指针使用较旧的初始化样式。2014 年 8 月 14 日之后,C++ 11 发布。您使用的编译器可能遵循 C++11 标准。

你可以替换0/NULLnullptr

现代 C++ 提供nullptr通用空指针。您应该使用它,而不是0 || NULL因为有些晦涩的机器具有带符号指针之类的东西,其中空指针实际上是 -1 而不是 0。

于 2019-12-24T08:28:10.433 回答