我想知道NULL
在C ++中是否保证是0
,所以我进行了搜索并发现了以下内容:
This答案指出:
这是Bjarne Stroustrup的措辞,
在C ++中,NULL的定义为0,因此只有一种美感。 区别。我更喜欢避免使用宏,因此我使用0。另一个问题 NULL是指人们有时会错误地认为它与众不同 从0开始,并且/或者不是整数。
似乎可以确认NULL
始终为0。
但是根据cppreference.com:
#define NULL /*implementation-defined*/
宏NULL是实现定义的空指针常量, 可能是:
->整数类型的整数常量表达式右值,其值是 到零(直到C ++ 11)
->整数文字,其值为零或prvalue类型 std :: nullptr_t(自C ++ 11起)
这显然表明NULL
与实现有关。
This答案说:
0(又称C的NULL桥接到C ++)可能会导致 重载的函数解析,其中包括:
f(int); f(foo *);
再次暗示NULL
是整数0
,可能会引起歧义
我遇到了其他问题和答案,但它们大多与C语言有关,而不与C ++有关。 This条评论说:
并且保证NULL为0
但同样,那是关于C的。
总而言之,在C ++中,NULL
总是0
吗? C呢? (对于每个标准实现)是否都与
#define NULL 0
注意:这个问题不是关于空指针的问题,而是C ++中的NULL
是否保证为0
整数。是否依赖于实现?
答案 0 :(得分:7)
是否保证NULL为0?
根据标准,NULL
是一个空指针常量(即文字)。确切地定义了实现。
在C ++ 11之前,空指针常量是整数值,其整数值等于0,因此0
或0l
等。
自C ++ 11起,存在新的空指针文字nullptr
,并且NULL
可以定义为nullptr
。 (因此对Bjarne的报价的字面解释已经过时了。)
在标准化之前:NULL
在C中可以定义为(void*)0
。由于C ++基于C,所以可能早于该标准的某些C ++方言就使用了该定义,但是这样的定义不符合标准的C ++。
为了完整起见:如下面的注释中链接的SO post所述,空指针常量为0不一定表示空指针地址的值为0(尽管地址很典型为0)
对此可以得出什么结论
NULL
来表示数字零(如果合适,请使用带有适当类型后缀的0
),也不要用来表示空终止符(使用'\0'
)。 / li>
NULL
会解决指针重载。NULL
,而如果您的标准是> = C ++ 11,请使用nullptr
。在较旧的标准中,如果需要使用(T*)NULL
或(T*)0
来解决重载问题……这表示在极少数情况下,使用指针重载整数有意义。答案 1 :(得分:0)
我认为这是一种很好的做法。话虽这么说,#undef NULL和/或将其重新定义为其他名称将是一种可怕的做法。长话短说,这不是100%的保证人,因为有可能发生其他事情,但绝不应该如此。