我正在尝试确定编译时C ++ 0x功能是否可用。是否有一个共同的预处理器宏?我正在使用Visual Studio 2010的编译器和英特尔的编译器。
答案 0 :(得分:4)
宏__cplusplus
将have a value大于199711L
。
尽管如此,并非所有编译器都会填写此值。最好使用Roger的解决方案。
答案 1 :(得分:3)
通常的方法是在构建系统中确定它,并在编译时传递“配置宏”,通常命名为HAS_ *。例如:compiler -DHAS_LAMBDA source.cpp
。
如果您可以从编译器版本宏确定这一点,那么您可以在配置标头中定义这些宏来检查;但是,对于由命令行选项控制的任何内容,您将无法执行此操作。您的构建系统确实知道您指定了哪些选项,并且可以使用该信息。
请参阅boost.config以获取有关特定编译器,版本和功能的真实示例和大量详细信息。
答案 2 :(得分:2)
我们遇到过与nullptr和auto_ptr类似的问题。以下是我们在使用标准化之前尝试使用的内容:
#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
它适用于GCC和Microsoft的Visual Studio。顺便说一下,nullptr
是一个关键字,无法测试 - 因此是nullptr_t
测试的原因。