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

51

如何查找GCC编译器支持的标准?我不是指在编译时如何查找正在使用的C++标准(检查定义的常量),而是在编译之前,如何检查可用的标准以使用(例如标志-std=c++??)?

man g++中没有此信息。

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

是否有可能在某个地方找到GCC版本和支持的标准的表格?


1
https://dev59.com/h2kw5IYBdhLWcg3wPYMP - M.M
5
http://en.cppreference.com/w/cpp/compiler_support - T.C.
5个回答

65

经过一番努力,我终于恢复了对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}'

那些方法很不专业,依赖于每个标准名称的帮助描述中出现“deprecated”、“C++”和/或“C”(请注意在grep "C "末尾有一个空格!),但它们似乎有效。您也可以类似地过滤掉例如“same as”以摆脱同义词等。

17

9
@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。


2
$(gcc -print-prog-name=cc1) --help | grep std 的一行版本: - rm1948

6
gcc和g++没有命令行选项可以检查此问题。希望-v选项能够提供有关支持的标准的信息。相反,您可以在gcc标准cppreference.com上查看在线文档以获取有用的摘要。
根据cppreference,完全支持c++11需要gcc 4.8.1;
而要拥有c++14的完全支持(包括一些c++17的新功能),则需要使用gcc 5.0及以上版本。

是否有任何表格或命令可用于列出哪些版本的gcc支持哪个标准? - Nav
1
@nav,前面提到的cppreference网站有很多编译器的漂亮表格,包括gcc。 - Davide Del Papa
等等,他们真的做到了:gcc -v --help 2>/dev/null | grep -e -std - undefined

4

这是我在互联网上找到的一张表格

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版本支持的最低标准。一些版本可能还支持更新的标准。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接