如何查找GCC编译器支持的标准?我不是指在编译时如何查找正在使用的C++标准(检查定义的常量),而是在编译之前,如何检查可用的标准以使用(例如标志-std=c++??
)?
在man g++
中没有此信息。
除了手动尝试选项外,我可以通过g++ --version
检查我的GCC版本吗?
是否有可能在某个地方找到GCC版本和支持的标准的表格?
如何查找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}'
gcc -v --help 2> /dev/null | grep -iv deprecated | grep "C " | sed -n '/^ *-std=\([^<][^ ]\+\).*/ {s//\1/p}'
grep "C "
末尾有一个空格!),但它们似乎有效。您也可以类似地过滤掉例如“same as”以摆脱同义词等。gcc
和g++
确实有一种打印它们支持的语言标准的方法。只是没有很好的文档记录。如果不是在--help
参数的帮助文本下方的括号中列出,我会说它基本上是隐藏的。完成此操作的方式是通过GNU编译器工具链并询问您正在使用的特定编译器实例的--help
文本。我在为自己的项目进行研究后才学到这一点,但为了将大量编译器捆绑到一个程序中,gcc
和g++
正是这样做的,它们使用主可执行文件作为与编译器、汇编器和链接器进程通信的中间人。为了访问帮助文本以获取给定编译器版本支持的语言标准,您必须询问编译器,而不是gcc
或g++
。
由于此时,我已经厌倦了输入两个命令,因此接下来的内容将假设我们使用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 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