代码之家  ›  专栏  ›  技术社区  ›  Aykhan Hagverdili

NULL是否保证为0?

  •  5
  • Aykhan Hagverdili  · 技术社区  · 7 年前

    我想知道 NULL 0 在C++中,我搜索并发现了这些:


    This 答复指出:

    这是比亚恩·斯特劳斯图普的话,

    空是指人们有时错误地认为它是不同的

    这似乎证实了这一点 始终为0。


    但是根据 cppreference.com :

    #define NULL /*implementation-defined*/
    

    宏NULL是一个实现定义的NULL指针常量,

    -&燃气轮机;一个整数类型的整型常量表达式rvalue,用于计算 归零(直到C++11)

    std::nullptr_t(从C++11开始)

    无效的 依赖于实现。


    This 答案是:

    0(又称.C的NULL桥接到C++中)可能会导致

    f(int); 
    f(foo *);
    

    这又意味着 无效的 是整数吗 0


    我遇到了其他问题和答案,但它们大多是关于C语言,而不是C++。 This

    但同样,这是关于C。


    总是 在C++中?那么C呢?(对于每个标准实施)是否与以下内容相同:

    #define NULL 0
    

    注意:这个问题不是关于空指针的,问题是如果 无效的 0

    2 回复  |  直到 7 年前
        1
  •  9
  •   eerorika    7 年前

    NULL是否保证为0?

    NULL 是一个空指针常量(即文本)。具体哪一个是实现定义的。

    0 0l 等

    自C++11以来,出现了一个新的空指针文本 nullptr 和 无效的 可定义为 nullptr

    无效的 可定义为 (void*)0 在C中,由于C++是基于C的,所以一些C++语言预先定义的标准可能使用了该定义,但是这种定义与标准C++不一致。


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

    • 不要使用 无效的 0 使用适当的类型后缀(如果适用),也不表示空终止符字符(使用 '\0' ).
    • 别这么想 无效的 解析为指针重载。
    • 无效的 而是使用 nullptr 如果您的标准为>=C++11。在旧标准中,您可以使用 (T*)NULL (T*)0 如果您需要它来解决过载问题。。。也就是说,在很少的情况下,用指针重载整数是有意义的。
    • 不要在指针中设置(或键入pun)零位。这不能保证是空指针。
        2
  •  0
  •   Mike    7 年前

    我认为这样假设是很好的做法。话虽如此,如果#取消NULL的定义,或者将其重新定义为其他内容,那将是一种可怕的做法。长话短说,它不是100%的保证,因为它可能是其他东西,但它永远不应该是。