【问题标题】:Test for C++11 in GCC 4.6在 GCC 4.6 中测试 C++11
【发布时间】:2016-02-23 14:56:51
【问题描述】:

这在 GCC 4.6 下编译失败:

#if __cplusplus >= 201103L
#include <ratio>
#endif

__cplusplus 应根据此错误在 GCC 4.6 中设置为“1”: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=1773

我应该如何测试 GCC 4.6 中的 C++11 支持?

编辑:我想在使用 GCC 4.6 构建时使用 Boost ratio,在 GCC 4.8 和 -std=c++11 构建时使用 std ratio。剩下的代码已经准备好了,只是这个包含编译失败。

【问题讨论】:

  • 最好测试已知可工作的编译器和版本。所以你可以使用__GNUC____GNUC_MINOR__
  • __GXX_EXPERIMENTAL_CXX0X__ 也许?但在这一点上,我只会认为 gcc-4.6(及更早版本)不支持 C++11,更简单,并且不排除那么多用户。

标签: c++11 gcc


【解决方案1】:

由于即使是理论上支持这个或那个标准版本的编译器也可能存在错误,因此最好依赖已知会产生有效结果的特定版本。

在 G++ 中,你可以这样做:

#if __GNUC__ == 4 && __GNUC_MINOR__ >= 9
  // use C++11 features
#else if __GNUC__ == 5
  // use C++11 features
#else
  // maybe don't use some features
#endif

【讨论】:

  • 长期使用#else if __GNUC__ &gt; 4(或&gt;= 5)不是更好吗?总有一天会有 GCC 6.x,因为粗心导致代码中断会很烦人。
  • @JonathanLeffler 是的;我主要关心的是展示如何考虑各种版本,特别是不要做类似 (major >= 4 && minor >= 9) 之类的事情——即如果major == 5 和minor == 0 会怎样。跨度>
【解决方案2】:

试着编译这个程序:

int main()
{
  auto i = 0;
  return 1;
}

在命令行中使用命令g++ -std=c++11 -c filename.cppauto 是 c++11 的特性,所以如果编译没有错误,说明你的编译器支持 C++11。

但总的来说,对于 gcc,在 5.1 版本之前,对 C++11 的支持是实验性的。所以直到 5.1 版本,gcc 才支持 C++11 提供的所有功能。

【讨论】:

  • "这意味着您的编译器支持 C++11" -- 这意味着您的编译器支持 C++11 的一项特定功能。它没有说明 C++11 的任何其他特性。如果您要尝试编译测试程序以查看编译器是否接受某个功能,最好准确测试您想要的功能。在这种情况下,测试程序可以是#include &lt;ratio&gt; / int main() {}
  • @hvd 你说得对,我的句子结构具有误导性。修改它。
猜你喜欢
  • 2012-08-27
  • 2012-08-27
  • 2012-01-29
  • 1970-01-01
  • 1970-01-01
  • 2013-05-29
  • 1970-01-01
  • 1970-01-01
  • 2016-01-26
相关资源
最近更新 更多