【问题标题】:Is NULL defined as nullptr in C++11?NULL 是否在 C++11 中定义为 nullptr?
【发布时间】:2011-11-04 06:24:05
【问题描述】:

C++11 实现会将NULL定义为nullptr吗?

这会被新的 C++ 标准规定吗?

【问题讨论】:

  • 标准说是允许的;尽管很少有实现可能真正做到这一点。

标签: c++ null c++11 nullptr


【解决方案1】:

从马的嘴里

C.3.2.4 宏 NULL [diff.null]

1/<clocale><cstddef><cstdio><cstdlib><cstring><ctime><cwchar> 中定义的宏 NULL 是本国际标准 (18.2) 中实现定义的 C++ 空指针常量。

由每个实现提供自己的定义,如果我记得 gcc 正确地将它定义为 __nullptr,它有特殊检查(例如,验证它没有在算术上下文中使用)。

因此可以将其定义为nullptr,您必须检查您的编译器/标准库文档以查看已完成的操作。

【讨论】:

  • 另一方面,标准并没有说必须是 nullptr,即使提出了更改。
  • @Bo:我不是一个标准主义者,英语也不是我的母语,所以我认为 implementation-defined 就是这个意思,即标准没有强加任何东西.
  • 我的意思是,有人提出标准应该要求 NULL 为 nullptr,但这并没有发生。
  • @Bo:好吧,我希望它有,它可能已经发现了许多错误。我可能是一个类型/编译器怪胎,但我必须承认我从来都不太理解拒绝这种更改的人。
【解决方案2】:

不,NULL 仍然和以前一样。太多人以令人惊讶的方式使用 NULL 宏,将其重新定义为 nullptr 会破坏很多代码。

详细说明:例如,人们已经将 NULL 用于多种句柄类型定义。如果这种 typedef 背后的真实类型不是指针,那么将 NULL 定义为 nullptr 将是一个问题。另外,似乎有些人确实使用 NULL 来初始化数值类型。

至少这是微软在将 nullptr 添加到 MSVC10 时发现的,也是他们决定保持 NULL 不变的原因。其他编译器可能会选择不同的路径,但我认为他们不会。

【讨论】:

  • 我见过使用 NULL 来初始化 char 数组元素的代码(它应该使用 '\0')。就我个人而言,我不介意破坏这样的代码,但向后兼容性是一个苛刻的情妇。
  • "...微软发现...他们决定保留 NULL ..." - 很好的信息。有参考链接吗?
  • @Martin:我从第 9 频道与 Stephan T. Lavavej(负责他们的 STL 实施的微软人)的视频之一中获得了有关 C++0x 功能的信息。不过我不记得确切的视频了。
【解决方案3】:

即将发布的标准C++11的FDIS,整型表达式依然是空指针 持续的。 NULL 宏仍然是实现定义的,但必须为 null 指针常量。所以在实践中它意味着它是好的 0 或者可以是 空指针。

使用 0 或 NULL 的代码将像以前一样工作。

阅读详情here

【讨论】:

  • 它不再是“即将推出”的标准。它已经是现行标准了。
  • @Nawaz:不是,不是正式的
  • 它已于 2011 年 8 月 12 日成为 ISO 标准。See this 上面写着The next revision of C++ that we’ve been calling “C++0x” is now an International Standard!”
  • @Nawaz:我不想告诉你,但我们只有 C++0x FDIS,它的内容与几周后的 C++11 标准相同. FDIS 获得批准。在发布之前,它不是标准。您的链接是 Herb 犯错误甚至撒谎的罕见情况之一。
  • @Als:Herb 是对的。根据 ISO/IEC 指令第 1 部分 2.7.8,投票是使 IS 脱离 FDIS 的原因。发布在 2.8 中
【解决方案4】:

NULL来自C,所以它的定义必须同时兼容C和C++。所以不能是nullptr,因为那是C++关键字,不是C,除非对C和C++定义不同(我们可以用#ifdef __cplusplus来区分)。所以 NULL 通常被定义为特定于编译器的东西,比如 gcc 中的 __nullptr,或者只是 ((void*)0)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-27
    • 2020-08-25
    • 2013-04-16
    • 2012-02-18
    • 2013-05-11
    • 1970-01-01
    • 2014-03-27
    • 1970-01-01
    相关资源
    最近更新 更多