在C ++ 11中是否将NULL定义为nullptr?

时间:2011-08-26 06:13:51

标签: c++ null c++11 nullptr

C ++ 11实现会将NULL定义为nullptr吗?

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

4 个答案:

答案 0 :(得分:17)

从马的嘴里

  

C.3.2.4宏NULL [diff.null]

     

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

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

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

答案 1 :(得分:9)

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

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

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

答案 2 :(得分:1)

即将推出的标准C ++ 11的FDIS,积分表达式仍然是一个空指针 不变。 NULL宏仍然是实现定义但必须为null 指针常数。所以在实践中它意味着它是0或可以是好的 nullptr。

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

阅读详细信息 here

答案 3 :(得分:-1)

NULL来自C,因此其定义必须与C和C ++兼容。因此它不能为nullptr,因为它是C ++关键字,而不是C,除非为C和C ++定义了不同的名称(我们可以使用#ifdef __cplusplus进行区分)。因此,通常将NULL定义为特定于smth编译器,例如gcc中的__nullptr或仅((void *)0)。