如何定义nullptr用于同时支持C ++ 03和C ++ 11? [重复](How to de

2019-07-29 07:51发布

可能重复:
“向后移植”到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

Answer 1:

在C ++ 11, nullptr是类型的nullptr_t 。 它的一个很大的优势相比, NULL (或0会说Bjarne的,因为他不喜欢宏)是这两个功能之间:

void foo(char*);
void foo(int);

foo(nullptr)将调用char*超载,但foo(NULL)将调用int超载。 所以,你的解决方案可以在大多数的情况下工作,但你可能有功能超载的错误。



Answer 2:

AFAIK你不能从代码检测自动nullptr支持。

在实践中,你可以阅读为“不可能”,这是一个非常强烈的“据我所知”。

因此要做的就是用特定的编译代码和/或建立命令。 例如,在每个相关源添加

#include <cpp/nullptr.h>

和在构建命令调整包括路径,使得对于编译器nullptr支持,这拿起一个空报头,而对于旧的编译器缺少nullptr ,它拿起定义它点菜迈尔斯(比如说)的报头。

然后测试很彻底!

我称具有报头的多个版本的一般概念,只用一个由构建命令选择,一个虚拟标题 。 它可以建立很多的机械解决这个问题,包括公约,只有有意义的更一般的情况。 令人高兴的是,没有必要为这种特殊情况下,但也许值得要注意的。

总结:使C ++源代码做事情神奇的是不走这里的路。 在构建一级加一点的帮助,似乎是正确的。 :-)



文章来源: How to define nullptr for supporting both C++03 and C++11? [duplicate]