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

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

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

其他回答

将指针设置为0并不那么清楚。特别是如果你使用c++以外的语言。这包括C语言和Javascript。

我最近用这样的代码删除:

DrawTo(BITMAP *buffer) =0;

第一次为纯虚函数。我以为这只是一个星期的魔术表演。当我意识到它基本上只是将函数指针设置为空(因为在c++的大多数情况下虚函数只是函数指针)时,我踢了自己一脚。

DrawTo(BITMAP *buffer) =null;

如果我的新眼睛没有间隔的话就不会那么令人困惑了。实际上,我想知道为什么c++不使用小写的null,就像它现在使用小写的false和true一样。

我通常用0。我不喜欢宏,而且不能保证您使用的某些第三方头文件不会将NULL重新定义为一些奇怪的东西。

你可以使用一个由Scott Meyers和其他人提出的nullptr对象,直到c++获得一个nullptr关键字:

const // It is a const object...
class nullptr_t 
{
public:
    template<class T>
    operator T*() const // convertible to any type of null non-member pointer...
    { return 0; }

    template<class C, class T>
    operator T C::*() const   // or any type of null member pointer...
    { return 0; }

private:
    void operator&() const;  // Can't take address of nullptr

} nullptr = {};

谷歌"nullptr"获取更多信息。

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

char *p;

...

if (p) { ... }

不会如你所愿。你必须写

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

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

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

我总是用:

指针为NULL '\0'表示字符 0.0用于浮点数和双精度数

0就可以了。这是一个传达意图的问题。话虽如此,我对此并不感兴趣。