NULL是否保证为0?

时间:2019-01-08 19:50:54

标签: c++ null

我想知道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整数。是否依赖于实现?

2 个答案:

答案 0 :(得分:7)

  

是否保证NULL为0?

根据标准,NULL是一个空指针常量(即文字)。确切地定义了实现。

在C ++ 11之前,空指针常量是整数值,其整数值等于0,因此00l等。

自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来解决重载问题……这表示在极少数情况下,使用指针重载整数有意义。
  • 考虑到从C转换为C ++时的定义可能不同,反之亦然。
  • 不要将零位(或键入pun)记忆到指针中。不能保证是空指针。

答案 1 :(得分:0)

我认为这是一种很好的做法。话虽这么说,#undef NULL和/或将其重新定义为其他名称将是一种可怕的做法。长话短说,这不是100%的保证人,因为有可能发生其他事情,但绝不应该如此。