【C++】GCC对应C++的版本支持

本文介绍了查看当前GCC版本的情况,阐述了GCC、gcc和g++之间的关系。GCC是GNU编译器集合,gcc是C编译器,g++是C++编译器,二者调用的编译器和传递给链接器的参数不同。还说明了GCC对不同C++标准的支持情况。

1、查看当前GCC的版本

pf@fNUC12WSKi7:~$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none:hsa
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.4.0-1ubuntu1~20.04.2' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++,gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-9-9QDOt0/gcc-9-9.4.0/debian/tmp-nvptx/usr,hsa --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2) 

可以看到对应的gcc的版本为9.4.0

2、gcc,g++,GNU之间的关系,待补充

GCC:GNU Compiler Collection(GUN 编译器集合),最初是作为C语言的编译器(GNU C Compiler),现在可以编译C、C++、JAVA、Fortran、Pascal、Object-C、Ada等语言
gcc是GCC中的GUN
C Compiler(C 编译器) g++是GCC中的GUN C++ Compiler(C++编译器)

gcc 和 g++ 的区别无非就是调用的编译器不同, 并且传递给链接器的参数不同,更准确的说法是:gcc调用了C compiler,而g++调用了C++ compiler

g++:

g++ 会把 .c 文件当做是 C++ 语言 (在 .c 文件前后分别加上 -xc++ 和 -xnone, 强行变成 C++), 从而调用 cc1plus 进行编译
g++ 遇到 .cpp 文件也会当做是 C++, 调用 cc1plus 进行编译
g++ 还会默认告诉链接器, 让它链接上 C++ 标准库
gcc:

gcc 会把 .c 文件当做是 C 语言. 从而调用 cc1 进行编译
gcc 遇到 .cpp 文件, 会处理成 C++ 语言. 调用 cc1plus 进行编译
gcc 默认不会链接上 C++ 标准库
只要是 GCC 支持编译的程序代码,都可以使用 gcc 命令完成编译。可以这样理解,gcc 是 GCC 编译器的通用编译指令,因为根据程序文件的后缀名,gcc 指令可以自行判断出当前程序所用编程语言的类别

但如果使用 g++ 指令,则无论目标文件的后缀名是什么,该指令都一律按照编译 C++ 代码的方式编译该文件。也就是说,对于 .c 文件来说,gcc 指令以 C 语言代码对待,而 g++ 指令会以 C++ 代码对待。但对于 .cpp 文件来说,gcc 和 g++ 都会以 C++ 代码的方式编译

因此并不能说gcc只能编译C代码,g++只能编译C++代码

不能用gcc编译C++程序的原因是:gcc在链接时不能自动和C++程序使用的库联接,因此只能使用g++来完成链接过程

https://gcc.gnu.org/releases.html对应官网

Release	Release date
GCC 13.2	July 27, 2023
GCC 10.5	July 7, 2023
GCC 11.4	May 29, 2023
GCC 12.3	May 8, 2023
GCC 13.1	April 26, 2023
GCC 12.2	August 19, 2022
GCC 10.4	June 28, 2022
GCC 9.5	May 27, 2022
GCC 12.1	May 6, 2022
GCC 11.3	April 21, 2022
GCC 11.2	July 28, 2021
GCC 9.4	June 1, 2021
GCC 8.5	May 14, 2021
GCC 11.1	April 27, 2021
GCC 10.3	April 8, 2021
GCC 10.2	July 23, 2020
GCC 10.1	May 7, 2020
GCC 9.3	March 12, 2020
GCC 8.4	March 4, 2020
GCC 7.5	November 14, 2019
GCC 9.2	August 12, 2019
GCC 9.1	May 3, 2019
GCC 8.3	February 22, 2019
GCC 7.4	December 6, 2018
GCC 6.5	October 26, 2018
GCC 8.2	July 26, 2018
GCC 8.1	May 2, 2018
GCC 7.3	January 25, 2018
GCC 5.5	October 10, 2017
GCC 7.2	August 14, 2017
GCC 6.4	July 4, 2017
GCC 7.1	May 2, 2017
GCC 6.3	December 21, 2016
GCC 6.2	August 22, 2016
GCC 4.9.4	August 3, 2016
GCC 5.4	June 3, 2016
GCC 6.1	April 27, 2016
GCC 5.3	December 4, 2015
GCC 5.2	July 16, 2015
GCC 4.9.3	June 26, 2015
GCC 4.8.5	June 23, 2015
GCC 5.1	April 22, 2015

GCC的支持情况
GCC编译器对不同的C++标准的支持情况:

C++17
gcc7完全支持,gcc6和gcc5部分支持,gcc6支持度当然比gcc5高,gcc4及以下版本不支持。
C++14
gcc5完全支持,gcc4部分支持,gcc3及以下版本不支持。
C++11
gcc4.8.1及以上完全支持。gcc4.3部分支持,gcc4.3以下版本不支持。

对应表格:
在这里插入图片描述
引用,侵删

<think>嗯,用户想了解高版本GCC是否支持C++20标准。这个问题其实挺专业的,可能是个C++开发者或者系统工程师在升级工具链时遇到的困惑。 从引用内容来看,用户已经查阅过相关资料了。引用[1]明确提到GCC从8版本开始陆续支持C++20特性,9及以前用-std=c++2a,11版本开始设为默认模式。不过用户似乎更关心“高版本”的具体支持程度,需要更精确的版本对应关系。 用户可能正在考虑是否要升级GCC来使用C++20的新特性,比如concept或module。ta的提问方式很精准,应该是有实际开发需求而非纯理论探讨。考虑到C++20的模块功能对构建系统影响很大,用户可能还隐含了迁移成本方面的担忧。 需要特别注意引用[4]提到的兼容性问题警示——即使版本号达标,某些特性(如正则表达式)在早期实现中可能不稳定。这点在回答时要着重强调,避免用户踩坑。 准备在回答中分三个层次:先说版本支持线(8/9/10/11/12/13),再说明如何启用标准,最后提醒功能实现差异。对“高版本”的定义要明确,建议以GCC 11为分水岭,因为这是默认启用C++20的起点。表格呈现会更清晰,但用户要求用行内公式,那就用文字描述版本演进。 用户可能还需要知道如何检查本地GCC版本,所以补充g++ --version命令示例。相关问题的设计要覆盖版本选择(Q1)、特性检测(Q2)、兼容风险(Q3)这三个实际开发中最关键的维度。</think>根据引用内容[^1]和[^2],GCC版本C++20标准的支持情况如下: 1. **支持起始版本** GCC从**8.0版本**开始初步支持C++20特性,后续版本逐步完善支持。主要版本演进: - **GCC 8**:首次引入C++20核心特性(如`operator<=>`、概念约束等) - **GCC 9**:扩展模块(Modules)支持、范围库(Ranges)等 - **GCC 10**:改进概念(Concepts)、协程(Coroutines) - **GCC 11**:成为**默认C++标准**(需配合`-std=c++20`) - **GCC 12/13**:补齐剩余特性(如格式化库`std::format`) 2. **启用方式** 编译时需显式指定标准: ```bash g++ -std=c++20 your_file.cpp # GCC 9+ g++ -std=c++2a your_file.cpp # GCC 8-9(旧标志) ``` 3. **关键注意事项** - **非完全兼容**:截至GCC 13.2,仍有少量特性未实现(如`std::generator`)[^1][^4] - **模块化编译**:需使用`-fmodules-ts`标志(实验性支持) - **版本验证**:通过`g++ --version`确认版本,或使用`__cplusplus == 202002L`宏检测 > ✅ **结论**:GCC 11及以上版本C++20提供**生产级支持**,建议使用GCC 12+以获得最佳兼容性。例如Ubuntu 22.04 LTS默认GCC 11.2支持核心特性,而GCC 13.2(最新稳定版)覆盖约95%特性[^1][^2]。 --- ### 📌 相关问题 1. **如何检查当前GCC版本是否支持特定C++20特性?** > *(例:可通过[GCC官方特性支持表](https://gcc.gnu.org/projects/cxx-status.html)查询)* 2. **在GCC中使用C++20模块(Modules)需要哪些额外步骤?** > *(涉及编译命令调整和文件组织方式)* 3. **GCCC++20与C++17的兼容性有何差异?是否可能引发代码迁移问题?** > *(需注意API变更和特性降级风险)* [^1]: GCC版本C++支持情况,包括C++20的启用标志和版本支持范围 [^2]: 不同版本gcc/g++默认支持C++标准及多标准兼容性 [^4]: 早期GCC版本(如4.8.5)对C++11特性的支持缺陷示例
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值