在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指针,但有时你仍然需要它们。
我通常用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"获取更多信息。
下面是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在我使用的头中定义不同。对于C,它被定义为(void*)0,而对于c++,它被定义为0。代码看起来像这样:
#ifndef __cplusplus
#define NULL (void*)0
#else
#define NULL 0
#endif
就我个人而言,我仍然使用NULL值来表示空指针,这表明你使用的是指针而不是某种整型。是的,在内部NULL值仍然是0,但它不是这样表示的。
此外,我不依赖于整数到布尔值的自动转换,而是显式地比较它们。
例如,更喜欢使用:
if (pointer_value != NULL || integer_value == 0)
而不是:
if (pointer_value || !integer_value)
可以这么说,这在c++ 11中都得到了纠正,可以简单地使用nullptr而不是NULL,也可以使用nullptr的类型nullptr_t。