11

可能重复:
将 nullptr“反向移植”到 C++-pre-C++0x 程序

如何定义nullptr同时支持 C++03 和 C++11?

下面的代码是否使用 C++03 和 C++11 编译而不改变 C++11 编译器中 nullptr 的含义?

#include <cstddef>

#if !defined(nullptr)
#define nullptr NULL
#endif
4

2 回答 2

13

在 C++11 中,nullptrnullptr_t. NULL与(或者0说 Bjarne,因为他不喜欢宏)相比,它的一大优势在于这两个函数之间:

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

foo(nullptr)将调用char*重载,但foo(NULL)将调用int重载。因此,您的解决方案可能在大多数情况下都有效,但您可能会遇到函数过载的错误。

于 2012-05-08T10:32:58.710 回答
9

AFAIK,您无法从代码中自动检测nullptr支持。

在实践中,您可以将其解读为“不可能”,这是一个非常强大的“AFAIK”。

因此要做的是使用编译器特定的代码和/或构建命令。例如,在每个相关来源中添加一个

#include <cpp/nullptr.h>

并在构建命令中调整包含路径,以便对于nullptr支持的编译器,这会选择一个空头文件,而对于缺少的旧编译器nullptr,它会选择一个定义它的头文件 à la Meyers(比如说)。

然后非常彻底地测试!

我将具有多个版本的标头的一般概念称为虚拟标头,只有一个由构建命令选择。可以围绕它构建很多机器,包括只在更一般的情况下才有意义的约定。令人高兴的是,这种特殊情况没有必要,但也许值得注意。

总结:让 C++ 源代码神奇地做事不是这里的路。在构建级别添加一些帮助似乎是正确的。:-)

于 2012-05-08T10:45:47.610 回答