GNU 编译器集合 (GCC) 是一个强大的开源编译器工具链,支持多种编程语言,包括 C、C++、Fortran、Ada、Go、D 和 COBOL 等。GCC 最初是为 GNU 操作系统开发的,旨在提供完全自由的软件工具,尊重用户的自由。
随着C++版本的更新迭代,许多旧的特性已经无法满足日益新增的需求。管理项目时,不同程序员开发所基于的C++版本有所差异,导致维护旧项目时需要切换旧的C++版本。
C++版本变化如下:
C++98版本
C++98 是 C++ 的第一个标准版本,奠定了 C++ 作为一种强大编程语言的基础。主要特性包括:
- 命名空间:引入了命名空间的概念,使得不同的库和代码片段能够在同一作用域中互不干扰地工作,提高了代码的可读性和可维护性。
- 标准化:C++98 为 C++ 语言制定了第一个官方标准,统一了不同编译器和平台之间的差异,提高了代码的可移植性和稳定性。
- STL(Standard Template Library):引入了一套通用的模板库,提供了丰富的数据结构和算法,大大简化了 C++ 编程的复杂性。
- 异常处理:引入了异常处理机制,使得程序能够在发生错误时以更加优雅的方式进行处理,提高了程序的健壮性。
C++11版本
C++11 是 C++ 的第二个标准版本,在 C++98 的基础上进行了大量的改进和扩展。主要特性包括:
- Lambda 表达式:引入了 Lambda 表达式,可以方便地定义匿名函数对象,用于实现回调函数和算法操作等。
- 自动类型推导:引入了 auto 关键字,可以根据初始化表达式自动推导出变量的类型,简化了代码书写。
- 范围 for 循环:引入了范围 for 循环的语法,使得遍历容器变得更加简洁和直观。
- 智能指针:引入了智能指针的概念,可以自动管理内存资源,避免了手动管理内存时可能出现的内存泄漏和野指针等问题。
C++14版本
C++14 是对 C++11 的进一步扩展和改进,主要特性包括:
- 放松的 constexpr 限制:放松了 constexpr 函数的限制,允许在 constexpr 函数中使用更多的语言特性,提高了编译时计算的灵活性和效率。
- 泛型 Lambda 表达式:引入了泛型 Lambda 表达式的概念,可以在 Lambda 表达式中使用 auto 关键字进行类型推导,提高了 Lambda 表达式的灵活性和可用性。
- 变量模板:引入了变量模板的概念,可以定义模板化的变量,使得代码更加通用和可重用。
C++17版本
C++17 引入了许多新的特性和功能,进一步提高了 C++ 编程的效率和安全性。主要特性包括:
- 模板参数推导:改进了模板参数推导的规则,使得在编写模板代码时能够更加简洁和直观。
- 结构化绑定:引入了结构化绑定的语法,可以方便地解构数据结构中的成员变量,提高了代码的可读性和可维护性。
- if constexpr 语句:引入了 if constexpr 语句的语法,可以在编译时进行条件判断和优化,提高了程序的运行效率。
C++20版本
C++20 是 C++ 语言的最新版本,引入了许多新特性和功能,以改进编程效率,增强语言功能,并提升开发者的生产力。主要特性包括:
- 模块(Modules):改进了程序的单元隔离和增量编译,提高了编译速度。
- 概念(Concepts):提供了编译时类型检查的功能,使得模板代码更加易于理解和维护。
- 协程(Coroutines):实现了轻量级的协程,简化了异步代码的编写,提高了代码的可读性和可维护性。
C++23版本
C++23 是 C++ 语言的下一个版本,预计会引入一些新的特性和功能。可能包含以下一些重要特性:
- 模块(Modules):进一步扩展模块的概念,提高编译速度和代码重用性。
- Deducing this:允许将非静态成员函数的隐式对象参数显式地写出来,简化代码。
- 概念(Concepts):进一步改进和完善概念的实现,以提供更加精确和灵活的类型检查功能。
查看当前GCC版本
gcc -v
安装多个GCC版本
例如安装GCC 9和GCC 11
sudo apt install gcc-9 g++-9 gcc-11 g++-11
查看已安装的GCC版本
ls /usr/bin/gcc*
使用update-alternatives工具切换GCC版本
什么是update-alternatives?
update-alternatives 是 Linux 系统中用于管理多个程序版本的命令行工具,广泛应用于基于 Debian 的发行版(如 Ubuntu)。它通过两级符号链接机制,提供了一个统一、安全的方式来切换系统默认使用的程序版本,例如 Java、Python、编辑器等。
添加新版本,可使用 --install 注册到系统,使用--slave 设置从属关系,即如果切换了gcc版本,则同时切换g++版本。
gcc与g++之间拥有主从关系。GCC(GNU Compiler Collection) 是一个编译器集合,而 G++ 是 GCC 中专门用于编译 C++ 代码的前端。
将不同版本的GCC添加到update-alternatives中
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 20 --slave /usr/bin/g++ g++ /usr/bin/g++-9
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 25 --slave /usr/bin/g++ g++ /usr/bin/g++-11
切换GCC版本
sudo update-alternatives --config gcc
验证切换结果
gcc --version
删除GCC版本
当某个版本不再需要时,可使用 --remove 删除:
从update-alternatives中删除某个GCC版本
sudo update-alternatives --remove gcc /usr/bin/gcc-9

参与讨论
(Participate in the discussion)
参与讨论
没有发现评论
暂无评论