1 GCC版本与C++标准的对应关系

C++到今年为止已经有了C++98、C++11、C++14、C++17、C++20,而C++23也于今年发布,而C++26也预计在2026年发布。目前在项目中一般是C++11作为标准,当然也有时会用到C++14和C++17的一些特性。

GCC是支持多种编程语言的编译套件,支持不同C++版本的编译,但是编译C++代码时需要找到正确的编译器,如果我们的项目中用的包含了C++14的部分特性,但是选择的GCC版本支持的最高版本是C++11,这个时候就会出现编译错误,或者在编译时不会出现编译错误,但是在运行时就会出现程序崩溃的问题。所以为了避免上述错误,弄清楚C++标准和编译器GCC版本之间的对应关系非常重要。

在GUN中GCC的这个页面详细介绍了GCC编译中对C++不同标准的支持,经过详细查看这个文档,我对C++标准和编译器GCC版本之间的对应关系进行了归纳,见下面这个表格

C++标准 GCC版本
C++98 C++98是GCC 6.1之前版本的默认C++语言标准,使用-std=c++98启用,如果要启用C++98功能之外的GNU扩展,则指定-std=gnu++98
C++11 GCC 4.8.1是C++11第一个功能完整的实现,使用-std=c++11启用,如果要启用C++98功能之外的GNU扩展,则指定-std=gnu++11。不过建议使用比GCC 4.8高的版本,建议使用GCC 6.1到GCC 10.0的版本,既支持C++11也支持C++14。
C++14 C++11是GCC 6.1到GCC 10.0(包含)的默认C++语言标准,使用-std=c++14启用,如果要启用C++98功能之外的GNU扩展,则指定-std=gnu++14
C++17 从GCC 11开始将C++17作为默认的C++语言标准,使用-std=c++17启用,如果要启用C++98功能之外的GNU扩展,则指定-std=gnu++17。一些C++17的功能从GCC 5就可用,但是只是实验性的,并不稳定,一直到GCC 9,C++17的功能才稳定下来。
C++20 C++20虽然已经发布3年了,但是GCC对C++20的支持还是处于实验性阶段,部分功能从GCC 8开始可用,使用-std=c++20启用功能(在GCC 9 以及更早版本则使用-std=c++2a),如果要启用C++20功能之外的GNU扩展,则需要添加-std=gnu20。
C++23 C++23的部分功能从GCC 11开始可用,但是GCC对C++23的支持也还是处于实验性阶段,使用-std=c++2b启用功能,如果要启用C++23功能之外的GNU扩展,则需要添加-std=gnu2b
C++26 GCC 对C++26标准的下一修订版提供实验性支持,预计将于 2026 年发布。

上表对C++标准和编译器GCC版本之间的对应关系进行了详细的梳理总结,对于当前项目中广泛使用的C++11标准代码的编译,建议使用GCC 10,既支持C++11也同时支持C++14,这和Visual Studio 2019的默认支持到C++14一样,如果项目跨平台且能够在Windows上在Visual Studio 2019上正确编译且运行,那么在Linux系统上使用GCC 10也可以正确编译和运行。

参考