编译器标准支持(c++11、c++14、c++17)
Compiler standards support (c++11, c++14, c++17)
如何找到我的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所做的评论几乎是正确的,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 和 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 版本支持的最低标准。某些版本可能还支持较新的标准。
- 枚举环境变量的惯用C++14/C++17方法
- begin() 在 C++17 年被制作为 constexpr 但在 C++14 年成为 cbegin() 吗?
- 为什么 std::atomic 构造函数在 C++14 和 C++17 中的行为不同
- 追问:C++14/C++17 中的变量到底是什么?
- 在 C++14 中,这种 C++17 倍表达的好选择是什么?
- C++11/14/17,GCC 7 与 GCC 8:好友类模板的名称查找
- log in cpp 14 and 17
- C++14 和 C++17 之间的区别使用:“*p++ = *p”
- 在C 14允许它的情况下,C 17禁止复制ELISION
- VS 中的 C++ 17 会导致 C++14 中不存在的变量(重新)评估错误
- c++14 std::experimental::filesystem::v1 和 c++17 std::filesys
- 字符串构造函数将两个字符* 放入另一个 std::string 在 C++14 中有效,但不适用于 C++17
- 如何让 CMake 基于 GCC 版本通过 std=c++14/c++1y 或 c++17/c++1z?
- 如何为C++14/C++17设置VS代码
- 是否有一种方法可以使此C 14递归模板在C 17中短
- C++14/17中的懒惰评估-只有lambdas或期货等
- C++14/17 项目可以使用使用 C++11 标准编译的二进制库还是需要重新编译源代码
- 链接C++17、C++14和C++11对象是否安全
- C++11/14/17:模板类指针作为模板参数
- C++11、14 或 17 是否提供了一种从 decltype() 中获取参数的方法?