在c++ 11中定义为nullptr为NULL

Is NULL defined as nullptr in C++11?

本文关键字:nullptr NULL 定义 c++      更新时间:2023-10-16

c++ 11实现是否将NULL定义为nullptr ?

新的c++标准会规定这一点吗?

来自马的嘴

C.3.2.4宏观NULL (diff.null)

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

这取决于每个实现提供自己的定义,如果我没记错的话,gcc将其定义为__nullptr,并对此进行了特殊检查(例如,验证它不在算术上下文中使用)。

所以它可以定义为nullptr,你必须检查你的编译器/标准库文档,看看已经做了什么

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

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

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

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

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

阅读详细信息在这里

NULL来自C,因此它的定义必须与C和c++兼容。所以它不能是nullptr,因为那是c++关键字,而不是C,除非它在C和c++中定义不同(我们可以使用#ifdef __cplusplus来区分它们)。所以NULL通常被定义为第smth编译器特定的,像gcc中的__nullptr,或者只是((void*)0)。