最好在C 11,零或空中使用
Whats better to use in C++11 , Zero or NULL?
如今,使用C 11,建议使用Zero
或NULL
?第二个如果?
int * p = getPointer();
if( 0 == p ){
// something
}
if( NULL == p ){
// something
}
更新:我忘记了新的
if( nullptr == p ){
// something
}
更新2:示例是要显示编写Null指针的选项,我知道编写if( !p )
更令人愉快。
其他答案是正确的。但是我想说的是为什么 nullptr
更好。
在C 11"完美转发"中非常重要。它在任何地方使用。明显的位置是bind
和function
。但是它也用于封面下的许多其他地方。但是"完美的转发"并不完美。它失败的地方之一是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
。对于这样的事情,它比0
或NULL
好,因为它没有机会在过载分辨率中用作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。
- 没有找到相关文章