C ++ 11实现会将NULL
定义为nullptr
吗?
新的C ++标准会规定这个吗?
答案 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)。