编译器标准支持(c ++ 11,c ++ 14,c ++ 17)

Šim*_*bec 6 c++ standards gcc

如何找到我的GCC编译器支持的标准?我的意思不是说在编译时如何找出正在使用的C ++标准(检查已定义的常量),但是在编译之前,如何检查可用的标准(用于flag -std=c++??)?

该信息不在中man g++

g++ --version除了手动尝试选项外,我还可以检出我的gcc版本吗?

是否可以在某处找到GCC版本和支持的标准表?

Jas*_*n C 10

所以,经过一番努力试图磨练我的sed技能后,我能够想出这个命令:

gcc -v --help 2> /dev/null | sed -n '/^ *-std=\([^<][^ ]\+\).*/ {s//\1/p}'
Run Code Online (Sandbox Code Playgroud)

它处理g++ -v --help(静默它打印到的额外信息stderr)的输出,匹配以开头的行-std=然后捕获值。该^<是阻断-std=<standard>的求助热线。以下是 GCC 9 的一些示例输出:

gcc -v --help 2> /dev/null | sed -n '/^ *-std=\([^<][^ ]\+\).*/ {s//\1/p}'
Run Code Online (Sandbox Code Playgroud)

您可以grep在中间添加一个以根据帮助描述文本进行过滤,这在帮助输出中方便地保持一致。例如,如果您想删除已弃用的:

gcc -v --help 2> /dev/null | grep -iv deprecated | sed -n '/^ *-std=\([^<][^ ]\+\).*/ {s//\1/p}'
Run Code Online (Sandbox Code Playgroud)

如果您只想列出未弃用的 C++:

gcc -v --help 2> /dev/null | grep -iv deprecated | grep "C++" | sed -n '/^ *-std=\([^<][^ ]\+\).*/ {s//\1/p}'
Run Code Online (Sandbox Code Playgroud)

如果您只想列出未弃用的 C:

gcc -v --help 2> /dev/null | grep -iv deprecated | grep "C " | sed -n '/^ *-std=\([^<][^ ]\+\).*/ {s//\1/p}'
Run Code Online (Sandbox Code Playgroud)

这些都非常老套,并且依赖于grep "C "每个标准名称的帮助描述中出现的“已弃用”、“C++”和/或“C”(注意末尾的空格!),但它们似乎有效。

您可以类似地过滤掉例如“相同”以摆脱同义词等。


Igo*_* R. 8

该信息可在GCC官方网站上找到。以下是相关表格:

C ++ 11功能支持

C ++ 14功能支持

C ++ 17功能支持


小智 7

@oldMammuth 发表的评论几乎是正确的,gcc并且g++确实有办法打印他们支持的语言标准。它只是没有很好的记录。如果它没有列在--help参数帮助文本下方的括号中,我会说它基本上是隐藏的。它的完成方式是通过 GNU 编译器工具链并询问您为它的--help文本使用的特定编译器实例。实际上,我是在为我自己的项目进行这项研究后才了解到这一点的,但是为了将一大堆编译器捆绑在一个程序中,gcc并且g++要做到这一点,他们使用主可执行文件作为与编译器、汇编器和链接器进程通信的中间人。为了访问帮助文本以获取给定编译器版本支持的语言标准,您必须询问编译器,而不是gccg++

由于在这一点上,我已经厌倦了输入这两个命令,其余的将假设我们正在使用gcc; 尽管事实上这两个命令实际上是可以互换的,并且基本上是同一个中间人,但名称不同。

您可以使用gcc -print-prog-name=cc1. 在我的系统上,这是/usr/lib/gcc/x86_64-linux-gnu/8/cc1. 然后,只需使用--help参数调用所述可执行文件,就可以了!请注意有数百个帮助参数条目。我实际上建议通过管道输出grep并使用正则表达式来查找它们,否则会有太多额外的信息真的很烦人。

或者:

您可以gcc -v --help按照gcc帮助文本中的说明使用,为给定工具链中的每个程序打印帮助对话框。然而,这确实会导致更多的输出。

同样,我的建议是使用正则表达式来搜索输出并找到支持的标准版本。gcc还支持比 C 和 C++ 更多的语言,包括但不限于 Fortran 和 Go。

  • 一行版本:`$(gcc -print-prog-name=cc1) --help | grep std` (3认同)

Dav*_*apa 6

gcc 和 g++ 没有命令行选项来检查这一点。如果 -v 选项能够告诉我们所支持的标准,那就太好了。相反,您可以在gcc Standards上查看在线文档,并在cppreference.com上查看有用的概要。

根据cppreference,gcc 4.8.1 完全支持 c++11;

要完全支持 c++14(以及 c++17 的一些新功能),您需要 gcc 5.0 及更高版本。


Zoh*_*ule 5

这是我在网上找到的一个表格

GCC Version   C++ Standard
4.9             C++11
5               C++14
6               C++14
7               C++17
8               C++17
9               C++20
10              C++20
11              C++20
12              C++20
13              C++20
Run Code Online (Sandbox Code Playgroud)

请注意,这些是 GCC 版本支持的最低标准。某些版本可能还支持更新的标准。