如何找到我的GCC编译器支持的标准?我不是指如何在编译时找到使用的C++标准(检查定义的常量),而是在编译之前,如何检查可用的标准(例如,标记-std=c++??)?man g++中不存在该信息。我可以检查出我的GCC版本的g++ --version除了手动尝试的选项?有没有可能在哪里找到GCC版本和支持标准的表格?
-std=c++??
man g++
g++ --version
vybvopom1#
因此,经过一番努力试图抹去我的sed技能之后,我能够想出以下命令:
sed
gcc -v --help 2> /dev/null | sed -n '/^ *-std=\([^<][^ ]\+\).*/ {s//\1/p}'
它处理g++ -v --help的输出(将打印到stderr的额外信息静音),匹配以-std=开头的行,然后捕获值。^<用于阻止帮助的-std=<standard>行。以下是GCC 9的一些示例输出:
g++ -v --help
stderr
-std=
^<
-std=<standard>
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,以便根据帮助描述文本进行过滤,这样可以方便地在帮助输出中保持一致。例如,如果您想删除弃用的内容:
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”来去掉同义词,等等。
grep "C "
3j86kqsm2#
这一信息可在海合会官方网站上查阅,相关表格如下:C11特性支持C14功能支持C17特性支持C20特性支持
gorkyyrv3#
@oldMammuth所做的评论几乎是正确的,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
g++
--help
gcc -print-prog-name=cc1
/usr/lib/gcc/x86_64-linux-gnu/8/cc1
备选方案:
您可以按照gcc帮助文本中的说明使用gcc -v --help来打印给定工具链中每个程序的帮助对话框。* 但这会导致更多输出。*同样,我的建议是使用正则表达式搜索输出并查找支持的标准版本。gcc还支持比C和C++更多的语言,包括但不限于Fortran和Go。
gcc -v --help
kqlmhetl4#
gcc和g没有命令行选项来检查它,如果-v选项能告诉你一些支持的标准就好了,你可以在gcc Standards上查看在线文档,在cppreference.com上查看有用的概要。根据 cppreference,gcc 4.8.1提供了对c11的全面支持;要完全支持c14(以及c17的一些新特性),你需要gcc5.0及以上版本。
1tuwyuhd5#
我在网上找到一张table
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版本支持的最低标准。有些版本可能还支持更新的标准。
5条答案
按热度按时间vybvopom1#
因此,经过一番努力试图抹去我的
sed
技能之后,我能够想出以下命令:它处理
g++ -v --help
的输出(将打印到stderr
的额外信息静音),匹配以-std=
开头的行,然后捕获值。^<
用于阻止帮助的-std=<standard>
行。以下是GCC 9的一些示例输出:您可以在中间添加一个
grep
,以便根据帮助描述文本进行过滤,这样可以方便地在帮助输出中保持一致。例如,如果您想删除弃用的内容:如果您只想列出未被弃用的C++:
如果您只想列出未被弃用的C:
这些都是相当陈腐的,依赖于每个标准名称的帮助描述中出现的“deprecated”、“C++”和/或“C”(注意
grep "C "
结尾的空格!),但它们似乎可以工作。你可以类似地过滤掉“same as”来去掉同义词,等等。
3j86kqsm2#
这一信息可在海合会官方网站上查阅,相关表格如下:
C11特性支持
C14功能支持
C17特性支持
C20特性支持
gorkyyrv3#
@oldMammuth所做的评论几乎是正确的,
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。kqlmhetl4#
gcc和g没有命令行选项来检查它,如果-v选项能告诉你一些支持的标准就好了,你可以在gcc Standards上查看在线文档,在cppreference.com上查看有用的概要。
根据 cppreference,gcc 4.8.1提供了对c11的全面支持;
要完全支持c14(以及c17的一些新特性),你需要gcc5.0及以上版本。
1tuwyuhd5#
我在网上找到一张table
注意这些是GCC版本支持的最低标准。有些版本可能还支持更新的标准。