19

C++11 实现会定义NULLnullptr?

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

4

4 回答 4

18

从马的嘴里

C.3.2.4 宏 NULL [diff.null]

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

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

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

于 2011-08-26T06:25:12.447 回答
9

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

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

至少这是微软在将 nullptr 添加到 MSVC10 时发现的,以及为什么他们决定像往常一样保持 NULL。其他编译器可能会选择不同的路径,但我认为他们不会。

于 2011-08-26T06:19:57.997 回答
1

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

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

在此处阅读详细信息。

于 2011-08-26T06:23:50.713 回答
-1

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

于 2019-12-26T09:49:22.353 回答