在C++中使用NULL?

Joo*_*kia 35 c++ null

可能重复:
你对C++中的指针使用NULL还是0(零)?

在C++中使用NULL或仅使用0值是个好主意吗?

在使用C++调用的C代码中是否存在使用NULL的特殊情况?像SDL?

Tar*_*ula 38

在C++中,NULL扩展为0或0L.请参阅Stroustrup的评论:

我应该使用NULL还是0?在C++中,NULL的定义是0,因此只有美学差异.我更喜欢避免宏,所以我使用0. NULL的另一个问题是人们有时会错误地认为它与0不同和/或不是整数.在预标准代码中,NULL有时被定义为不适合的东西,因此必须/必须避免.这些日子不太常见.

如果必须命名空指针,则将其命名为nullptr; 这就是它将在C++ 0x中调用的内容.然后,"nullptr"将是一个关键字.

  • 另外,在代码中继续使用NULL而不是0的一个很好的理由是当你升级到支持`nullptr`关键字的编译器时,搜索和替换"NULL"将比为"0"执行相同操作容易得多. ". (4认同)
  • @Noah @Jookia @Praetorian:[`nullptr`很容易实现](http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/nullptr).如果需要,创建一个`nullptr.hpp`文件,包含它的定义,并使用它.当C++ 0x出现时,只需删除include和include-directives. (4认同)
  • @Jookia:不!不要在代码中使用“#define nullptr 0”,请阅读上面 Noah Roberts 的评论。如果您这样做,当您升级到 C++0x 兼容编译器时,您的代码可能无法编译(这将是一件好事)或执行奇怪的操作。 (3认同)
  • 我想我不得不在最后一点不同意 Stroustrup。我会避免在尚未实现 nullptr 的系统中使用 nullptr,确切原因是稍后会实现。nullptr 关键字的行为不能用完整定义复制。我认为它根本无法复制。您可能会遇到这样的情况:您的代码在某一天做一件事,然后在编译器升级之后,又会发生完全不同的事情。本质上,'nullptr' 关键字旨在解决的所有问题都会改变。 (2认同)

小智 14

C++中NULL的缺点是它是0的定义.这是一个可以静默转换为指针,bool值,float/double或int的值.

这不是非常类型安全的,并且导致了我工作的应用程序中的实际错误.

考虑一下:

void Foo(int i);
void Foo(Bar* b);
void Foo(bool b);


main()
{
     Foo(0);         
     Foo(NULL); // same as Foo(0)
} 
Run Code Online (Sandbox Code Playgroud)

C++ 11定义了一个nullptr可转换为空指针但不能转换为其他标量的指针.所有现代C++编译器都支持这一点,包括2008年的VC++.在旧版本的GCC中有一个类似的功能,但后来被调用__null.