可能重复:
“Backporting” nullptr to C++-pre-C++0x programs如何定义nullptr以支持C++ 03和C++ 11?
如何定义nullptr
为同时支持C++ 03和C++ 11?
以下代码是否与C++ 03和C++ 11一起编译,而不改变C++ 11编译器中nullptr的含义?
#include <cstddef>
#if !defined(nullptr)
#define nullptr NULL
#endif
可能重复:
“Backporting” nullptr to C++-pre-C++0x programs如何定义nullptr以支持C++ 03和C++ 11?
如何定义nullptr
为同时支持C++ 03和C++ 11?
以下代码是否与C++ 03和C++ 11一起编译,而不改变C++ 11编译器中nullptr的含义?
#include <cstddef>
#if !defined(nullptr)
#define nullptr NULL
#endif
在C++ 11,nullptr
是nullptr_t
类型。其中一个比较NULL
(或0
会说Bjarne的,因为他不喜欢宏)它的最大优势是,这两者之间的功能:
void foo(char*);
void foo(int);
foo(nullptr)
将调用char*
超载,但foo(NULL)
将调用int
超载。因此,您的解决方案可能适用于大多数情况,但您可能在函数超载时出错。
当然不是* only *的优势。你也可以在'nullptr_t'上重载,这非常有用。 –
模板参数推导推导'nullptr_t'为'nullptr','int'为'NULL'。 –
AFAIK您不能自动化从代码中检测到nullptr
的支持。
在实际应用中,你可以读到作为“不可能”,它’一个相当强大的“ AFAIK ”。
因此要做的事情是使用编译器特定的代码和/或构建命令。例如,在每个相关源添加
#include <cpp/nullptr.h>
和在构建命令调整包括路径,使得对于编译器nullptr
支持,这拿起一个空报头,而对于旧的编译器缺少nullptr
,它拿起一个标题,定义它在拉梅耶斯(说)。
然后测试非常彻底!
我称之为具有多个版本的标题的一般概念,其中只有一个由构建命令选择,一个虚拟标题。围绕这一点建立许多机制是可能的,包括只在更一般情况下才有意义的惯例。令人高兴的是,对于这种特殊情况,这并不是必需的,但也许值得注意。
总结:使C++源代码神奇地做事情不是去这里的方式。在构建级别添加一些帮助似乎是正确的。 :-)
“AFAIK至少不能自动从代码中检测到nullptr支持”,而不是以涵盖不合规编译器的方式,实际上这些编译器几乎都是这些编译器。在符合的编译器上,你可以做到,因为C++ 03编译器保证不支持'nullptr'作为关键字,而C++ 11编译器则保证它不具备。所以你需要做的是检查哪一个。 –
@Steve:是的。 :-) 呵呵 –
它正确吗?不,不是。如果'NULL'等价于'nullptr',那么首先就没有理由引入这个特性。你问我们什么?你的代码是否会编译*? –
检查此解决方案:http://stackoverflow.com/questions/8747005/backporting-nullptr-to-c-pre-c0x-programs – Alexander
'定义(nullptr)'将失败,因为'nullptr'是关键字,而不是定义。 – Griwes