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

Compiler standards support (c++11, c++14, c++17)

本文关键字:c++14 c++17 c++11 标准 支持 编译器      更新时间:2023-10-16

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

该信息man g++中不存在。

除了手动尝试选项之外,我还可以通过g++ --version来查看我的 GCC 版本?

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

所以,在试图掸去我的sed技能之后,我能够想出这个命令:

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

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

f2003
f2008
f2008ts
f2018
f95
gnu
legacy
c++03
c++0x
c++11
c++14
c++17
c++1y
c++1z
c++2a
c++98
c11
c17
c18
c1x
c2x
c89
c90
c99
c9x
gnu++03
gnu++0x
gnu++11
gnu++14
gnu++17
gnu++1y
gnu++1z
gnu++2a
gnu++98
gnu11
gnu17
gnu18
gnu1x
gnu2x
gnu89
gnu90
gnu99
gnu9x
iso9899:1990
iso9899:199409
iso9899:1999
iso9899:199x
iso9899:2011
iso9899:2017
iso9899:2018

您可以在中间添加一个grep,以根据帮助描述文本进行筛选,这在帮助输出中是一致的。 例如,如果您想删除已弃用的:

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

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

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

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

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

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

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

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

C++11 功能支持

C++14 功能支持

C++17 功能支持

C++20 功能支持

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

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

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

或者:

您可以使用gcc帮助文本中所述的gcc -v --help来打印给定工具链中每个程序的帮助对话框。但是,这确实会导致更多的输出。

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

gcc 和 g++ 没有命令行选项来检查这一点。最好使用 -v 选项来说明所支持的标准。相反,您可以在 gcc 标准中查看在线文档,并在 cppreference.com 上查看有用的概要。

根据 cpp 偏好,gcc 4.8.1 完全支持 c++11;

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

这是我

在互联网上找到的一张桌子

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

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