如何定义nullptr
同时支持 C++03 和 C++11?
下面的代码是否使用 C++03 和 C++11 编译而不改变 C++11 编译器中 nullptr 的含义?
#include <cstddef>
#if !defined(nullptr)
#define nullptr NULL
#endif
如何定义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
重载。因此,您的解决方案可能在大多数情况下都有效,但您可能会遇到函数过载的错误。
AFAIK,您无法从代码中自动检测nullptr
支持。
在实践中,您可以将其解读为“不可能”,这是一个非常强大的“AFAIK”。
因此要做的是使用编译器特定的代码和/或构建命令。例如,在每个相关来源中添加一个
#include <cpp/nullptr.h>
并在构建命令中调整包含路径,以便对于nullptr
支持的编译器,这会选择一个空头文件,而对于缺少的旧编译器nullptr
,它会选择一个定义它的头文件 à la Meyers(比如说)。
然后非常彻底地测试!
我将具有多个版本的标头的一般概念称为虚拟标头,只有一个由构建命令选择。可以围绕它构建很多机器,包括只在更一般的情况下才有意义的约定。令人高兴的是,这种特殊情况没有必要,但也许值得注意。
总结:让 C++ 源代码神奇地做事不是这里的路。在构建级别添加一些帮助似乎是正确的。:-)