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

3zwtqj6y  于 2023-01-02  发布在  其他
关注(0)|答案(5)|浏览(197)

如何找到我的GCC编译器支持的标准?我不是指如何在编译时找到使用的C++标准(检查定义的常量),而是在编译之前,如何检查可用的标准(例如,标记-std=c++??)?
man g++中不存在该信息。
我可以检查出我的GCC版本的g++ --version除了手动尝试的选项?
有没有可能在哪里找到GCC版本和支持标准的表格?

vybvopom

vybvopom1#

因此,经过一番努力试图抹去我的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”来去掉同义词,等等。

3j86kqsm

3j86kqsm2#

这一信息可在海合会官方网站上查阅,相关表格如下:
C11特性支持
C
14功能支持
C17特性支持
C
20特性支持

gorkyyrv

gorkyyrv3#

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

kqlmhetl

kqlmhetl4#

gcc和g没有命令行选项来检查它,如果-v选项能告诉你一些支持的标准就好了,你可以在gcc Standards上查看在线文档,在cppreference.com上查看有用的概要。
根据 cppreference,gcc 4.8.1提供了对c
11的全面支持;
要完全支持c14(以及c17的一些新特性),你需要gcc5.0及以上版本。

1tuwyuhd

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

相关问题