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

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

static const int nullptr = 0;

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

其他回答

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

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

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

几乎总是有更好的选择。

曾经有人告诉我……我将把NULL重新定义为69。从那以后,我不再使用它:P

它使您的代码非常脆弱。

编辑:

标准中并非所有内容都是完美的。宏NULL是一个实现定义的c++空指针常量,与C NULL宏不完全兼容,除了类型隐藏隐式转换它在一个无用的和容易出错的工具。

NULL不是一个空指针,而是一个O/OL文字。

告诉我下一个例子不会让人困惑:

void foo(char *); 
void foo(int); 
foo(NULL); // calls int version instead of pointer version! 

是不是因为这一切,在新标准中出现了std::nullptr_t

如果你不想等待新标准的出台,想要使用nullptr,至少要使用一个像Meyers建议的那样像样的nullptr(参见jonh comment)。

下面是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.

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

我认为有一些论点(其中一个是最近的)与Bjarne在这方面的立场相矛盾。

Documentation of intent Using NULL allows for searches on its use and it also highlights that the developer wanted to use a NULL pointer, irrespective of whether it is being interpreted by the compiler as NULL or not. Overload of pointer and 'int' is relatively rare The example that everybody quotes is: void foo(int*); void foo (int); void bar() { foo (NULL); // Calls 'foo(int)' } However, at least in my opinion, the problem with the above is not that we're using NULL for the null pointer constant: it's that we have overloads of foo() which take very different kinds of arguments. The parameter must be an int too, as any other type will result in an ambiguous call and so generate a helpful compiler warning. Analysis tools can help TODAY! Even in the absence of C++0x, there are tools available today that verify that NULL is being used for pointers, and that 0 is being used for integral types. C++ 11 will have a new std::nullptr_t type. This is the newest argument to the table. The problem of 0 and NULL is being actively addressed for C++0x, and you can guarantee that for every implementation that provides NULL, the very first thing that they will do is: #define NULL nullptr For those who use NULL rather than 0, the change will be an improvement in type-safety with little or no effort - if anything it may also catch a few bugs where they've used NULL for 0. For anybody using 0 today... well, hopefully they have a good knowledge of regular expressions...

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

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

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

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