确定C ++ 0x可用性

时间:2009-12-29 16:51:32

标签: c++ visual-studio-2010 c++11 preprocessor

我正在尝试确定编译时C ++ 0x功能是否可用。是否有一个共同的预处理器宏?我正在使用Visual Studio 2010的编译器和英特尔的编译器。

3 个答案:

答案 0 :(得分:4)

__cplusplushave 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测试的原因。