2

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

4

3 回答 3

4

__cplusplus具有大于的值199711L

也就是说,并非所有编译器都会填写此值。最好使用罗杰的解决方案。

于 2009-12-29T17:28:56.073 回答
3

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

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

请参阅boost.config以获取真实示例以及有关特定编译器、版本和功能的大量详细信息。

于 2009-12-29T18:22:41.193 回答
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

于 2011-08-12T03:59:43.313 回答