【发布时间】:2011-11-04 06:24:05
【问题描述】:
C++11 实现会将NULL定义为nullptr吗?
这会被新的 C++ 标准规定吗?
【问题讨论】:
-
标准说是允许的;尽管很少有实现可能真正做到这一点。
C++11 实现会将NULL定义为nullptr吗?
这会被新的 C++ 标准规定吗?
【问题讨论】:
从马的嘴里
C.3.2.4 宏 NULL [diff.null]
1/ 在
<clocale>、<cstddef>、<cstdio>、<cstdlib>、<cstring>、<ctime>或<cwchar>中定义的宏 NULL 是本国际标准 (18.2) 中实现定义的 C++ 空指针常量。
由每个实现提供自己的定义,如果我记得 gcc 正确地将它定义为 __nullptr,它有特殊检查(例如,验证它没有在算术上下文中使用)。
因此可以将其定义为nullptr,您必须检查您的编译器/标准库文档以查看已完成的操作。
【讨论】:
nullptr,即使提出了更改。
不,NULL 仍然和以前一样。太多人以令人惊讶的方式使用 NULL 宏,将其重新定义为 nullptr 会破坏很多代码。
详细说明:例如,人们已经将 NULL 用于多种句柄类型定义。如果这种 typedef 背后的真实类型不是指针,那么将 NULL 定义为 nullptr 将是一个问题。另外,似乎有些人确实使用 NULL 来初始化数值类型。
至少这是微软在将 nullptr 添加到 MSVC10 时发现的,也是他们决定保持 NULL 不变的原因。其他编译器可能会选择不同的路径,但我认为他们不会。
【讨论】:
'\0')。就我个人而言,我不介意破坏这样的代码,但向后兼容性是一个苛刻的情妇。
即将发布的标准C++11的FDIS,整型表达式依然是空指针 持续的。 NULL 宏仍然是实现定义的,但必须为 null 指针常量。所以在实践中它意味着它是好的 0 或者可以是 空指针。
使用 0 或 NULL 的代码将像以前一样工作。
阅读详情here。
【讨论】:
The next revision of C++ that we’ve been calling “C++0x” is now an International Standard!”
NULL来自C,所以它的定义必须同时兼容C和C++。所以不能是nullptr,因为那是C++关键字,不是C,除非对C和C++定义不同(我们可以用#ifdef __cplusplus来区分)。所以 NULL 通常被定义为特定于编译器的东西,比如 gcc 中的 __nullptr,或者只是 ((void*)0)。
【讨论】: