在查阅 C++ 资料或配置开发环境时,我们经常会看到 C++98、C++11、C++14、C++17、C++20、C++23 等不同名字。
很多初学的小伙伴看到这么多数字,容易以为它们是好几门不同的语言。其实它们都是同一门 C++ 语言,只是代表在不同年份发布的 “官方标准版本”。
C++ 版本号是什么意思?
C++ 是一门由国际标准化组织(ISO)统一制定规则的编程语言。每隔几年,标准委员会就会对语言语法和标准库做一次扩充与完善,并发布一份新的官方标准。
平时看到的 “C++ 加两位数字”,其实就是按发布年份的后两位来命名的。比如 1998 年的首个国际标准叫 C++98,2011 年的重要升级版叫 C++11,而 C++20 则发布于 2020 年。从 C++11 开始,C++ 保持着每 3 年更新一次的固定节奏。
需要注意的是,新标准并不是把旧版本的语法推翻重来,而是在完整保留原有基础语法的前提下,继续增加更好用、更安全的新特性。也就是说,新版本的 C++ 标准依然兼容以前编写的常规基础代码。
比如在程序里定义一个保存整数的变量,也就是给数据起个名字存起来。早期的 C++98 必须手动写出类型名 int,而 C++11 新增了 auto 关键字,能根据右侧数值自动识别类型。下面看一个简单例子。
示例:传统写法与现代简写
#include <iostream>
int main() {
int a = 10; // C++98 起通用写法
auto b = 20; // C++11 起自动识别类型
std::cout << a << "\n";
std::cout << b << "\n";
return 0;
}运行结果如下。
10
20分析:
int a = 10; 这一句代码表示定义一个整数类型的变量 a,并将 10 赋值给它。这种基础写法从早期的 C++98 到现在的 C++20 都是通用的,无论标准怎么升级,C++ 的基础语法骨架都没有变。
下一行的 auto b = 20; 则是从 C++11 开始支持的现代简写。编译器看到等号右边的 20,就能自动识别出它是一个整数,省去了手动写类型名的步骤。不过要注意,b 在编译阶段依然被固定为整数类型,后面同样不能随便往里面塞入一段文字。
C++ 主要标准版本对比
从 1998 年至今,C++ 先后发布了多个标准版本,各主要版本的发布年份与定位如下表所示。
| 标准版本 | 发布年份 | 版本定位与学习建议 |
|---|---|---|
| C++98 / C++03 | 1998 / 2003 | 早期传统标准,奠定了 C++ 语法基础,如今多在维护旧项目或阅读老教材时遇到 |
| C++11 | 2011 | 现代 C++ 的起点,新增了自动类型识别、智能指针等大量实用特性 |
| C++14 / C++17 | 2014 / 2017 | 在 C++11 基础上做实用扩充,目前不少企业项目以 C++17 作为起步标准 |
| C++20 | 2020 | 继 C++11 之后的又一次重要升级,功能成熟稳定,推荐作为学习主线 |
| C++23 | 2023 | 较新的现代标准,在 C++20 基础上继续补充标准库实用工具 |
| C++26 | 2026 | 新一代标准,主流编译器仍在逐步完善支持,初学阶段简单了解即可 |
注意 小伙伴们不要把 “C++ 标准版本” 和 “编译器版本” 搞混了。比如我们后面安装的编译器可能显示为 GCC 14 或 GCC 15,这里的 14、15 是编译器软件自身的版本号,并不是说存在 “C++15” 这样的语言标准版本。
C++ 标准版本的选择与指定
面对这么多标准版本,初学者在实际学习和写代码时,重点把握好版本选择与编译参数这两点即可。
1. 推荐的学习版本
既然现在已经有了更新的 C++23 甚至 C++26,为什么我们更推荐选择 C++20 作为学习主线呢?主要有以下 2 个原因:
- 编译器支持成熟稳定:C++ 标准是由委员会制定的规则文档,实际运行代码还要靠 GCC、Clang、MSVC 等编译器去实现。越新的标准,不同编译器的支持进度往往不一致。C++20 经过多年打磨,主流编译器都已经支持得非常完善,照着敲代码不会遇到 “教程里能跑、自己电脑上报错” 的情况。
- 完整覆盖现代主流写法:C++20 已经把 C++11、C++14、C++17 以及 C++20 自身最实用、最常见的现代特性全部包含在内。无论是日常项目开发、学校课程还是求职面试,掌握基于 C++20 的现代写法都已经非常够用。
2. 编译时指定标准版本
不同编译器默认开启的 C++ 标准可能不一样,比如部分旧版本默认只开启 C++14 或 C++17。为了确保代码能按统一规则顺利编译,我们可以在编译命令中加上 -std 参数来指定标准版本。
在本地配置开发环境并安装好 g++ 编译器之后,我们就可以在终端里执行下面这条编译命令:
g++ -std=c++20 hello.cpp -o hello.exe上面命令中间的 -std=c++20 就是用来指定语言标准版本的参数,表示让 g++ 编译器按照 C++20 的规则来编译源文件 hello.cpp。以后如果参与的团队项目要求统一使用 C++17,只需要把这个参数改成 -std=c++17 就可以了。
常见问题
1. 为什么市面上有些老教材或大学课本还在使用 C++98 的写法?
主要是因为部分传统教材编写年份较早,一直没有同步更新。这类教材虽然把变量、循环、函数等基础语法讲清楚了,但往往花大量篇幅讲原始指针和手动管理内存,很少涉及现代标准库。咱们学习时会把底层基础与现代实用写法结合起来,既能应付学校考试,也能对接实际开发。
2. 学会 C++20 之后,以后遇到使用 C++17 或 C++23 的项目能适应吗?
完全可以。不同版本的 C++ 并不是割裂的,日常开发中绝大多数基础语法和标准库工具都是相通的。只要把 C++20 的底子打牢,以后无论项目要求使用 C++17 还是升级到 C++23,只需要花很少的时间了解一下个别版本差异就能快速上手。
