C++11 实现会定义NULL
为nullptr
?
这会由新的 C++ 标准规定吗?
从马的嘴里
C.3.2.4 宏 NULL [diff.null]
1/
<clocale>
在、<cstddef>
、<cstdio>
、<cstdlib>
、<cstring>
、<ctime>
或中的任何一个中定义的宏 NULL<cwchar>
是本国际标准 (18.2) 中实现定义的 C++ 空指针常量。
由每个实现提供自己的定义,如果我记得正确定义了__nullptr
它有特殊检查的 gcc(例如,验证它没有在算术上下文中使用)。
因此可以将其定义为nullptr
,您必须检查您的编译器/标准库文档以查看已完成的操作。
不,NULL 还是和以前一样。太多人以令人惊讶的方式使用 NULL 宏,将其重新定义为 nullptr 会破坏很多代码。
详细说明:人们已经将 NULL 用于多种句柄类型定义。如果这种 typedef 背后的真实类型不是指针,那么将 NULL 定义为 nullptr 将是一个问题。此外,似乎有些人确实使用 NULL 来初始化数字类型。
至少这是微软在将 nullptr 添加到 MSVC10 时发现的,以及为什么他们决定像往常一样保持 NULL。其他编译器可能会选择不同的路径,但我认为他们不会。
即将发布的标准 C++11 的 FDIS,整数表达式仍然是一个空指针常量。NULL 宏仍然是实现定义的,但必须是一个空指针常量。所以在实践中这意味着它可以为 0 或者可以是 nullptr。
您使用 0 或 NULL 的代码将像以前一样工作。
在此处阅读详细信息。
NULL 来自 C,所以它的定义必须同时兼容 C 和 C++。所以不能是nullptr,因为那是C++关键字,不是C,除非对C和C++定义不同(我们可以用#ifdef __cplusplus来区分)。所以 NULL 通常被定义为特定于编译器的东西,比如 gcc 中的 __nullptr,或者只是 ((void*)0)。