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

Ami*_*yan 8 c++ nullptr c++11 c++03

可能重复:
"backporting"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
Run Code Online (Sandbox Code Playgroud)

Mor*_*enn 12

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

void foo(char*);
void foo(int);
Run Code Online (Sandbox Code Playgroud)

foo(nullptr)将调用char*过载,但foo(NULL)将调用int过载.因此,您的解决方案可能适用于大多数情况,但您可能会遇到功能过载错误.

  • 当然不是*唯一*优势.您也可以在`nullptr_t`上重载,这非常有用. (7认同)
  • 模板参数推导推导出`nullptr`的`nullptr_t`和'NULL`的`int`. (4认同)

Che*_*Alf 9

AFAIK你无法在代码内自动检测nullptr支持.

在实践中,您可以将其视为"不可能",它是一个非常强大的"AFAIK".

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

#include <cpp/nullptr.h>
Run Code Online (Sandbox Code Playgroud)

并在构建命令中调整包含路径,以便对于具有nullptr支持的编译器,这将获取一个空标头,而对于缺少的旧编译器nullptr,它会选择一个标头来定义它(例如Meyers).

然后进行非常彻底的测试!

我称之为具有多个版本的标头的一般概念,只有一个由构建命令选择的虚拟标头.围绕这种情况建立许多机制是可能的,包括在更一般的情况下才有意义的惯例.令人高兴的是,这个特殊情况并非必要,但也许值得注意.

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