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


当前回答

我尽量使用c++参考来避免整个问题。而不是

void foo(const Bar* pBar) { ... }

你可能经常会写作

void foo(const Bar& bar) { ... }

当然,这并不总是有效的;但是空指针可能会被过度使用。

其他回答

我认为有一些论点(其中一个是最近的)与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'赋值给它。

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

我更喜欢使用NULL,因为它清楚地表明,您的意图是值表示指针而不是算术值。不幸的是,它是一个宏,但由于它是如此广泛地根深蒂固,几乎没有什么危险(除非有人做了一些非常愚蠢的事情)。我希望从一开始它就是一个关键字,但是你能做什么呢?

也就是说,我对使用指针本身作为真值没有问题。就像NULL一样,这是一个根深蒂固的习惯用语。

c++ 09将添加nullptr构造,我认为这是早就该有的。

奇怪,没有人,包括Stroustroup提到过。虽然谈论了很多标准和美学,但没有人注意到用0代替NULL是危险的,例如,在架构的变量参数列表中sizeof(int) != sizeof(void*)。像Stroustroup一样,出于审美原因,我更喜欢0,但必须小心不要在其类型可能不明确的地方使用它。

我曾经在一台机器上工作,其中0是一个有效地址,NULL被定义为一个特殊的八进制值。在该机器上(0 != NULL),因此代码如

char *p;

...

if (p) { ... }

不会如你所愿。你必须写

if (p != NULL) { ... }

虽然我相信现在大多数编译器都将NULL定义为0,但我仍然记得那些年前的教训:NULL不一定是0。