最好在C 11,零或空中使用

Whats better to use in C++11 , Zero or NULL?

本文关键字:      更新时间:2023-10-16

如今,使用C 11,建议使用ZeroNULL?第二个如果?

int * p = getPointer();
if( 0 == p ){
    // something
}
if( NULL == p ){
    // something
}

更新:我忘记了新的

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

更新2:示例是要显示编写Null指针的选项,我知道编写if( !p )更令人愉快。

其他答案是正确的。但是我想说的是为什么 nullptr更好。

在C 11"完美转发"中非常重要。它在任何地方使用。明显的位置是bindfunction。但是它也用于封面下的许多其他地方。但是"完美的转发"并不完美。它失败的地方之一是Null Pointer常数。

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。

即使您在代码中并不完美地转发,您的代码也很可能在封面下使用它。

都不,它是 nullptr

,但是,就您而言,我只是选择

if ( !p ){
   //something
}

2.14.7指针文字[lex.nullptr]

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

c 11具有新的文字关键字nullptr。对于这样的事情,它比0NULL好,因为它没有机会在过载分辨率中用作int

if ( nullptr == p )

或当然您可以在布尔上下文中使用指针:

if ( !p )

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

您可以将0/NULL替换为nullptr

Modern C 提供nullptr作为通用空指针。您应该使用它而不是0 || NULL,因为有一些晦涩的机器具有签名指针,其中null指针实际上是-1而不是0。

相关文章:
  • 没有找到相关文章