NULL保证为0吗?

Ayx*_*xan 7 c++ null

我想知道是否NULL保证使用0C++,所以我搜索并发现了这些:


这个答案表明:

这是Bjarne Stroustrup的措辞,

在C++中,NULL的定义是0,因此只有美学差异.我更喜欢避免宏,所以我使用0. NULL的另一个问题是人们有时会错误地认为它与0不同和/或不是整数.

这似乎证实NULL总是0.


但根据cppreference.com:

#define NULL /*implementation-defined*/
Run Code Online (Sandbox Code Playgroud)

宏NULL是一个实现定义的空指针常量,可能是:

- >整数类型的整数常量表达式rvalue,其计算结果为零(直到C++ 11)

- >值为零的整数文字,或类型为std :: nullptr_t的prvalue(自C++ 11起)

这清楚地说NULL是依赖于实现.


这个答案说:

0(也称为C的NULL桥接到C++中)可能导致重载函数解析的模糊性,除其他外:

f(int); 
f(foo *);
Run Code Online (Sandbox Code Playgroud)

这再次暗示这NULL是整数0,可能会导致歧义


我遇到了其他问题和答案,但它们主要是关于C语言,而不是C++.这里的一个评论说:

并且NULL保证为0

但同样,这是关于C.


总而言之,NULL总是0在C++中?C怎么样?是(对于每个标准实现)是否相同:

#define NULL 0
Run Code Online (Sandbox Code Playgroud)

注意:这个问题与空指针无关,问题是NULL在C++中是否保证是0整数.它是依赖于实现的吗?

eer*_*ika 8

NULL保证为0吗?

根据标准,NULL是一个空指针常量(即文字).究竟是哪一个,是实现定义的.

之前C++ 11,空指针常数积分常数,其积分值等于0,那么00l

从C++ 11开始,有一个新的空指针文字nullptr,NULL可以定义为nullptr.(因此Bjarne引用的字面解释已经过时了).

在标准化之前:NULL可以(void*)0在C中定义.由于C++是基于C的,因此标准之前的某些C++方言可能使用了该定义,但这种定义不符合标准C++.


并且为了完整性:正如在下面的注释中链接的SO post中更详细地解释的,空指针常量为0并不一定意味着空指针地址的值为0(尽管地址为0是非常典型的).

可以得出以下结论:

  • 不要NULL用来表示数字零(0如果合适,使用适当的类型后缀),也不要表示空终止符(使用'\0').
  • 不要假设NULL解析为指针过载.
  • 要表示空指针,请不要使用NULL,而是使用nullptr标准为> = C++ 11.在较旧的标准中,您可以使用(T*)NULL或者(T*)0如果您需要它来进行重载解析......那就说很少有情况下使用指针重载整数是有道理的.
  • 考虑到从C转换为C++时定义可能不同,反之亦然.
  • 不要将零位memset(或输入双关)写入指针.这不能保证是空指针.

  • [如果你的机器具有非零位模式的nullptr怎么办?](/sf/answers/193298591/) (2认同)