在C++11中,NULL被定义为nullptr吗?

19

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

这是否是新的C++标准所规定的?


2
标准规定允许这样做,但实际上很少有实现会这样做。 - Billy ONeal
4个回答

18

权威消息

C.3.2.4 NULL宏 [diff.null]

1/ 宏NULL在任何一个头文件、、、、、或中定义,是国际标准(18.2)中的C++实现定义的空指针常量。

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

因此,将其定义为nullptr是可能的,您需要检查编译器/标准库文档以了解已经完成了什么工作。


另一方面,标准并没有规定必须使用nullptr,尽管有人提出了这种更改。 - Bo Persson
@Bo:我不是标准主义者,英语也不是我的母语,所以我认为“实现定义”就是指标准没有强制规定任何内容。 - Matthieu M.
4
我的观点是,曾有人建议将标准更改为要求将NULL替换为nullptr,但这并未发生。 - Bo Persson
@Bo:啊,好吧,我希望它能够发现更多的错误。我可能是一个类型/编译器狂热者,但我必须承认我从未完全理解那些拒绝这种变化的人。 - Matthieu M.

9
不,NULL仍然和之前一样。太多人以出乎意料的方式使用了NULL宏定义,将其重新定义为nullptr会破坏大量代码。
具体来说,人们例如使用NULL作为许多句柄typedef的示例。如果此类typedef背后的真实类型不是指针,则将NULL定义为nullptr将是一个问题。此外,似乎有些人确实使用NULL来初始化数字类型。
至少微软在向MSVC10添加nullptr时发现了这一点,并决定保持NULL始终如旧。其他编译器可能会选择不同的路径,但我认为他们不会这样做。

1
我看过使用NULL来初始化char数组元素的代码(其应该使用'\0')。个人而言,我不介意破坏这样的代码,但是向后兼容性却是一个严苛的主人。 - Keith Thompson
“微软发现...他们决定保留NULL...” - 不错的信息。你有任何参考链接吗? - Martin Ba
1
@Martin:我从Channel 9的一个Stephan T. Lavavej视频中得到了这些关于C++0x特性的信息(他是微软STL实现的负责人)。不过我不记得具体是哪个视频了。 - TeaWolf

0

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

您以前使用的代码中使用0或NULL的部分仍然可以正常工作。

详细信息请阅读这里


它不再是“即将到来”的标准了。它已经成为当前的标准。 - Nawaz
@Nawaz:这不是官方的。 - Alok Save
1
它已成为ISO标准,于2011年8月12日通过。请参考此链接:http://herbsutter.com/2011/08/12/we-have-an-international-standard-c0x-is-unanimously-approved/ ,该链接指出,“我们一直称之为‘C++0x’的下一个修订版现在成为了国际标准!” - Nawaz
4
@Als: Herb 是正确的。根据 ISO/IEC 指令第一部分 2.7.8 的规定,投票是将 FDIS 变为 IS 的关键。出版事宜在 2.8 中有所涉及。 - MSalters
当NULL被定义为nullptr时,像int i = NULL;这样的代码将不再起作用,但是这是允许的。使用NULL的代码在某些编译器上将不会“像以前一样工作”,因此你的答案是错误的。 - Sjoerd
显示剩余2条评论

-1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接