可能重复:
“向后移植”到nullptr C ++ -前的C ++ 0x方案
如何定义nullptr
用于同时支持C ++ 03和C ++ 11?
下面是否代码编译与两个C ++ 03和C ++ 11没有改变编译nullptr在C ++编译器11的意思?
#include <cstddef>
#if !defined(nullptr)
#define nullptr NULL
#endif
可能重复:
“向后移植”到nullptr C ++ -前的C ++ 0x方案
如何定义nullptr
用于同时支持C ++ 03和C ++ 11?
下面是否代码编译与两个C ++ 03和C ++ 11没有改变编译nullptr在C ++编译器11的意思?
#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
超载。 所以,你的解决方案可以在大多数的情况下工作,但你可能有功能超载的错误。
AFAIK你不能从代码检测中自动nullptr
支持。
在实践中,你可以阅读为“不可能”,这是一个非常强烈的“据我所知”。
因此要做的就是用特定的编译代码和/或建立命令。 例如,在每个相关源添加
#include <cpp/nullptr.h>
和在构建命令调整包括路径,使得对于编译器nullptr
支持,这拿起一个空报头,而对于旧的编译器缺少nullptr
,它拿起定义它点菜迈尔斯(比如说)的报头。
然后测试很彻底!
我称具有报头的多个版本的一般概念,只用一个由构建命令选择,一个虚拟标题 。 它可以建立很多的机械解决这个问题,包括公约,只有有意义的更一般的情况。 令人高兴的是,没有必要为这种特殊情况下,但也许值得要注意的。
总结:使C ++源代码做事情神奇的是不走这里的路。 在构建一级加一点的帮助,似乎是正确的。 :-)