c++ 它是安全的#define NULL nullptr?

我看到下面的宏在许多最高的头文件:

#define NULL 0  // C++03

在所有代码中,NULL和0可互换使用。如果我改变它。

#define NULL nullptr  // C++11

它会造成任何不良的副作用吗?我可以想到唯一的(好的)副作用,如下使用会变得不合格;

int i = NULL;
最佳答案

I have seen below macro in topmost header file:

你不应该看到,标准库定义在< cstddef> (和< stddef.h>)。并且,根据标准,IIRC重新定义由标准头文件定义的名称将导致未定义的行为。所以从纯粹的标准的角度来看,你不应该这样做。

我看到人们做了以下事情,无论他们的想法想到什么原因:

struct X{
  virtual void f() = NULL;
}

(如[错误地]:“将虚拟表指针设置为NULL”)

这仅在NULL被定义为0时有效,因为= 0是纯虚函数的有效标记(§9.2[class.mem])。

也就是说,如果NULL被正确地用作空指针常量,那么什么都不应该中断。

但是,请注意,即使看似正确地使用,这将改变:

void f(int){}
void f(char*){}

f(0); // calls f(int)
f(nullptr); // calls f(char*)

然而,如果是这样的话,它几乎肯定是破碎的。

转载注明原文:c++ 它是安全的#define NULL nullptr? - 代码日志