在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指针,但有时你仍然需要它们。


当前回答

主要是个人偏好,尽管有人可能会说,NULL使对象很明显是一个指针,目前不指向任何东西,例如。

void *ptr = &something;
/* lots o' code */
ptr = NULL; // more obvious that it's a pointer and not being used

IIRC,标准不要求NULL为0,所以使用<stddef.h>中定义的任何东西可能对你的编译器是最好的。

争论的另一个方面是是否应该使用逻辑比较(隐式转换为bool)或对NULL进行显式检查,但这也归结于可读性。

其他回答

下面是Stroustrup对此的看法:c++风格和技术常见问题解答

In C++, the definition of NULL is 0, so there is only an aesthetic difference. I prefer to avoid macros, so I use 0. Another problem with NULL is that people sometimes mistakenly believe that it is different from 0 and/or not an integer. In pre-standard code, NULL was/is sometimes defined to something unsuitable and therefore had/has to be avoided. That's less common these days. If you have to name the null pointer, call it nullptr; that's what it's called in C++11. Then, nullptr will be a keyword.

也就是说,不要为小事烦恼。

主要是个人偏好,尽管有人可能会说,NULL使对象很明显是一个指针,目前不指向任何东西,例如。

void *ptr = &something;
/* lots o' code */
ptr = NULL; // more obvious that it's a pointer and not being used

IIRC,标准不要求NULL为0,所以使用<stddef.h>中定义的任何东西可能对你的编译器是最好的。

争论的另一个方面是是否应该使用逻辑比较(隐式转换为bool)或对NULL进行显式检查,但这也归结于可读性。

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

使用0或NULL都有相同的效果。

然而,这并不意味着它们都是很好的编程实践。鉴于在性能上没有差异,选择低级感知选项而不是不可知论/抽象选项是一种糟糕的编程实践。帮助代码的读者理解您的思维过程。

NULL, 0,0.0, '\0', 0x00和其他东西都转换为相同的东西,但在你的程序中是不同的逻辑实体。它们应该这样使用。NULL是指针,0是数量,0x0是位感兴趣的值,等等。无论指针是否编译,都不能将'\0'赋值给它。

我知道一些社区鼓励通过打破环境契约来展示对环境的深入了解。然而,负责任的程序员会编写可维护的代码,并将此类实践排除在他们的代码之外。

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

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

static const int nullptr = 0;

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