Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+;中为NULL定义为nullptr+;11?_C++_Null_C++11_Nullptr - Fatal编程技术网

C++ 在C+;中为NULL定义为nullptr+;11?

C++ 在C+;中为NULL定义为nullptr+;11?,c++,null,c++11,nullptr,C++,Null,C++11,Nullptr,C++11实现是否将NULL定义为nullptr 这是新的C++标准规定的吗?< /P> < P>不,NULL还是以前一样。太多人以令人惊讶的方式使用NULL宏,将其重新定义为nullptr会破坏很多代码 详细说明:例如,人们在许多类型的句柄typedef中使用了NULL。如果此类typedef后面的实际类型不是指针,那么将NULL定义为nullptr将是一个问题。此外,似乎有些人确实使用NULL来初始化数字类型 至少这是微软在MSVC10中添加nullptr时发现的,也是他们决定保持NULL不

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


这是新的C++标准规定的吗?< /P> < P>不,NULL还是以前一样。太多人以令人惊讶的方式使用NULL宏,将其重新定义为nullptr会破坏很多代码

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


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

FDIS即将推出的标准C++11,integral表达式仍然是空指针 常数NULL宏仍然是实现定义的,但必须为NULL 指针常数。因此,在实践中,这意味着它与0一样好,或者可以是 nullptr

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

从马的嘴里读细节

C.3.2.4宏空[diff.NULL]

<强> 1 /< /强>宏空,定义在“<代码> <代码> >代码> <代码> >代码> <代码>、<代码> <代码>、<代码> <代码>、<代码> <代码>、或<代码> <代码>,是本国际标准(18.2)中定义的C++空指针常数。

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


可以定义为“代码> NulLPTR < /C>”,您必须检查编译器/标准库文档,看看已经做了什么。

null来自C,所以它的定义必须与C和C++兼容。所以它不能是NulLPTR,因为这是C++关键字,而不是C,除非它对C和C++定义不同(我们可以使用γIFIFF和CPLUS PLUS来区分它们)。因此,NULL通常被定义为特定于smth编译器的,比如gcc中的uu nullptr,或者仅仅是((void*)0)。

标准说它是允许的;虽然很少有实现可能真正做到这一点。另一方面,标准没有规定is必须是
nullptr
,即使提出了这一修改。@Bo:我不是标准主义者,英语也不是我的母语,所以我认为实现定义的意思正是,ie标准没有强加任何东西。我的观点是,有人建议标准应该要求NULL为nullptr,但那没有发生。@Bo:好吧,我希望它有,它可能已经发现了一些bug。我可能是一个类型/编译器怪胎,但我必须承认我从来都不太了解拒绝这种更改的人。我见过使用NULL初始化字符数组元素的代码(它应该使用
'\0'
)。就我个人而言,我不介意破坏这样的代码,但向后兼容性是一个严酷的虐待。”…微软发现…他们决定保留NULL…-很好的信息。你有什么参考链接吗?@Martin:我从9频道的一个视频中得到了关于C++0x功能的信息,该视频是Stephan T.Lavavej(负责STL实现的微软人)的。我不记得确切的视频了。它不再是“即将到来的”标准了。它已经是一个现行标准了。@Nawaz:不是,不是正式的。它已于2011年8月12日成为ISO标准。上面说的代码>我们现在所说的“C++ 0x”的C++修订版现在已经成为国际标准了!code>@Nawaz:我不想告诉你,但我们只有C++0x FDI,它的内容与几周后的C++11标准完全相同。FDI获得批准。在出版之前,它不是一个标准。你的链接是赫伯犯错误,甚至撒谎的罕见地方之一。@Als:Herb是对的。根据ISO/IEC指令第1部分,2.7.8,投票是将FDIS变成is的关键。第2.8节介绍了出版物