2012-05-08 36 views
7

可能重复:
“Backporting” nullptr to C++-pre-C++0x programs如何定义nullptr以支持C++ 03和C++ 11?

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

以下代码是否与C++ 03和C++ 11一起编译,而不改变C++ 11编译器中nullptr的含义?

#include <cstddef> 

#if !defined(nullptr) 
#define nullptr NULL 
#endif 
+5

它正确吗?不,不是。如果'NULL'等价于'nullptr',那么首先就没有理由引入这个特性。你问我们什么?你的代码是否会编译*? –

+4

检查此解决方案:http://stackoverflow.com/questions/8747005/backporting-nullptr-to-c-pre-c0x-programs – Alexander

+7

'定义(nullptr)'将失败,因为'nullptr'是关键字,而不是定义。 – Griwes

回答

10

在C++ 11,nullptrnullptr_t类型。其中一个比较NULL(或0会说Bjarne的,因为他不喜欢宏)它的最大优势是,这两者之间的功能:

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

foo(nullptr)将调用char*超载,但foo(NULL)将调用int超载。因此,您的解决方案可能适用于大多数情况,但您可能在函数超载时出错。

+7

当然不是* only *的优势。你也可以在'nullptr_t'上重载,这非常有用。 –

+3

模板参数推导推导'nullptr_t'为'nullptr','int'为'NULL'。 –

8

AFAIK您不能自动化从代码中检测到nullptr的支持。

在实际应用中,你可以读到作为“不可能”,它’一个相当强大的“ AFAIK ”。

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

#include <cpp/nullptr.h> 

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

然后测试非常彻底!

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

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

+1

“AFAIK至少不能自动从代码中检测到nullptr支持”,而不是以涵盖不合规编译器的方式,实际上这些编译器几乎都是这些编译器。在符合的编译器上,你可以做到,因为C++ 03编译器保证不支持'nullptr'作为关键字,而C++ 11编译器则保证它不具备。所以你需要做的是检查哪一个。 –

+0

@Steve:是的。 :-) 呵呵 –