在c++的早期,当它被固定在C的顶部时,你不能使用NULL,因为它被定义为(void*)0。你不能将NULL赋值给除void*以外的任何指针,这使得它有点无用。在那些日子里,人们接受使用0(零)作为空指针。

直到今天,我仍然使用0作为空指针,但我周围的人坚持使用null。我个人认为给一个现有的值命名(NULL)没有任何好处-因为我也喜欢将指针作为真值测试:

if (p && !q)
  do_something();

那么使用0就更有意义了(就像如果你使用NULL,你不能在逻辑上使用p && !q -你需要显式地与NULL进行比较,除非你假设NULL为零,在这种情况下为什么要使用NULL)。

是否有任何客观的原因让人们更喜欢0而不是NULL(反之亦然),或者这只是个人偏好?

编辑:我应该补充(最初的意思是说),对于RAII和异常,我很少使用零/NULL指针,但有时你仍然需要它们。


当前回答

我主张在任何可能的情况下都不要使用0或NULL指针。

使用它们迟早会导致你的代码出现分段错误。根据我的经验,指针是c++中最大的bug来源之一

此外,它还会导致在整个代码中出现“if-not-null”语句。如果您可以依赖始终有效的状态,那就更好了。

几乎总是有更好的选择。

其他回答

我总是用0。不是因为什么真正的原因,只是因为当我第一次学习c++时,我读到一些建议使用0的东西,我总是这样做。理论上,在可读性方面可能会出现混淆问题,但实际上,在数千个工时和数百万行代码中,我从未遇到过这样的问题。正如Stroustrup所说,在标准变成nullptr之前,这实际上只是一个个人审美问题。

我主张在任何可能的情况下都不要使用0或NULL指针。

使用它们迟早会导致你的代码出现分段错误。根据我的经验,指针是c++中最大的bug来源之一

此外,它还会导致在整个代码中出现“if-not-null”语句。如果您可以依赖始终有效的状态,那就更好了。

几乎总是有更好的选择。

使用NULL。NULL表示你的意图。它是0是一个实现细节,应该无关紧要。

我认为标准保证NULL == 0,所以你可以做任何一件事。我更喜欢NULL,因为它记录了您的意图。

我很久以前就停止使用NULL而改用0了(以及大多数其他宏)。我这样做不仅是因为我想尽可能地避免宏,还因为NULL似乎在C和c++代码中被过度使用了。它似乎被用于任何需要0值的地方,而不仅仅是指针。

在新项目中,我把这个放在项目头中:

static const int nullptr = 0;

现在,当c++ 0x兼容的编译器到来时,我所要做的就是删除这一行。 这样做的一个好处是Visual Studio已经将nullptr识别为关键字并适当地突出显示它。