【问题标题】:Determine C++0x availability确定 C++0x 可用性
【发布时间】:2009-12-29 16:51:32
【问题描述】:

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

【问题讨论】:

  • 我知道这是重复的,只是找不到。编辑:这里是:stackoverflow.com/questions/1686348/…
  • 感谢 GMAN,但这仅在实施完整标准的情况下才有效(显然)。英特尔返回 199711,即使它有 lambdas
  • C++0x 的功能目前是非标准的。没有标准的方法来表明非标准特征的存在。如果您正在寻找单个功能,则必须在构建系统中滚动您自己的指标。
  • @Thornley - 一个很好的观点

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


【解决方案1】:

__cplusplushave a value 大于199711L

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

【讨论】:

  • 你有从草案中得到保证的报价吗?
  • 不,只是 Bjarne 的网站。我认为他所说的可能符合标准,尽管我认为情况可能并非如此。
  • Neil:最好的可用只是脚注 149,第 383 页,“本标准的未来版本将用更大的值替换此宏的值。” [n2723](与当前标准 16.8 完全相同。)
  • 真正的问题是编译器不使用这个宏的标准值,要么是因为它们“没有 100% 的支持”,要么是其他原因;当您谈论对草稿中不同功能的部分/实验性支持时,它甚至不适用。
  • 我预见到对于依赖 __cplusplus 的人来说会有很多损坏的代码——当然不是我!
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    我们在 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-31
      • 2010-11-01
      • 2010-12-27
      • 1970-01-01
      • 2011-02-25
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      • 2011-10-31
      相关资源
      最近更新 更多