2009-12-29 27 views
2

我试图确定编译时C++ 0x功能是否可用。是否有一个通用的预处理器宏?我正在使用Visual Studio 2010的编译器和Intel的编译器。确定C++ 0x可用性

+1

我知道这是重复的,我只是找不到它。编辑:这是它:http://stackoverflow.com/questions/1686348/what-is-defined-if-a-compiler-is-cpp0x-compliant – GManNickG 2009-12-29 17:29:13

+0

谢谢GMAN,但只有在完整的标准实施()显然)。即使它有lambda表达式,英特尔也会返回199711 – Steve 2009-12-29 18:46:18

+2

C++ 0x的功能目前是非标准的。没有标准的方式来表明非标准功能的存在。如果您正在寻找个人功能,则必须在构建系统中推出自己的指标。 – 2009-12-29 18:52:13

回答

4

__cplusplushave a value大于199711L

也就是说,并不是所有的编译器都会填充这个值。最好使用罗杰的解决方案。

+0

您有来自草案的引用来保证吗? – 2009-12-29 18:24:04

+0

即使使用'icc -std = C++ 0x',\ _ \ _ cplusplus仍然定义为1. – 2009-12-29 18:26:25

+2

只是Bjarne的网站。我认为他所说的可能会达到标准,但我想这可能并非如此。 – GManNickG 2009-12-29 18:29:23

3

通常的做法是在编译系统中确定它,并在编译时传递“配置宏”,通常命名为HAS_ *。例如:compiler -DHAS_LAMBDA source.cpp

如果你可以从编译器版本宏中确定这个,那么你可以在配置头文件中定义这些宏来检查它;但是,对于任何由命令行选项控制的内容,您都无法执行此操作。然而,您的构建系统确实知道您指定的选项,并且可以使用该信息。

查看boost.config为一个真实的例子和大量关于特定编译器,版本和功能的细节。

2

我们对nullptr和auto_ptr有类似的问题。下面是我们正在尝试使用,直到somehing标准化:

#include <cstddef> 
... 

// GCC: compile with -std=c++0x 
#if defined(__GNUC__) && ((__GNUC__ == 4 && __GNUC_MINOR__ >= 6) || (__GNUC__ >= 5)) 
# define HACK_GCC_ITS_CPP0X 1 
#endif 

#if defined(nullptr_t) || (__cplusplus > 199711L) || defined(HACK_GCC_ITS_CPP0X) 
# include <memory> 
    using std::unique_ptr; 
# define THE_AUTO_PTR unique_ptr 
#else 
# include <memory> 
    using std::auto_ptr; 
# define THE_AUTO_PTR auto_ptr 
#endif 

它运作良好,在海湾合作委员会和微软的Visual Studio。顺便说一句,nullptr是一个关键字,不能被测试 - 因此测试的原因是nullptr_t