作者:解学武

C语言的五套标准:C89、C99、C11、C17和C23

我们今天使用的 Windows、Linux、Mac OS 等操作系统都是由一种叫做 Unix 的系统演化而来。Unix 作为 80 年代主流的操作系统,是整个软件工业的基础,是现代操作系统的开山鼻祖,C语言就是为 Unix 而生的。

Unix 和 C语言的开发者是同一人,名字叫丹尼斯·里奇(Dennis MacAlistair Ritchie)

丹尼斯·里奇(Dennis MacAlistair Ritchie)
C语言和 Unix 之父——丹尼斯·里奇
2011 年 10 月 12 日(北京时间为 10 月 13 日),丹尼斯·里奇去世,享年 70 岁。

C语言的诞生

1967 年,26 岁的丹尼斯·里奇进入贝尔实验室开发 Unix,并于 1969 年圣诞节前推出第一个试运行版本。这个时候的 Unix 是用汇编语言写的,移植性非常差,要想让 Unix 运行在不同型号的机器上,就得针对每个型号的机器重写一遍操作系统,这显然是一个不可能完成的任务。

为了提高通用性和开发效率,丹尼斯·里奇决定发明一种新的编程语言——C语言。紧接着,丹尼斯·里奇就用 C语言改写了 Unix 上的 C语言编译器,他的同事汤姆森则使用 C语言重写了 Unix,使它成为一种通用性强、移植简单的操作系统,从此开创了计算机编程史上的新篇章,C语言也成为了操作系统专用语言。

C89标准

到了 80 年代,C语言越来越流行,广泛被业界使用,从大型主机到小型微机,各个厂商群雄并起,推出了多款C语言的编译器。这些编译器根据行业和厂商自己的需求,进行了各种扩展,C语言进入了春秋战国时代,逐渐演变成一个松散杂乱的大家族。

为统一 C语言版本,1983 年美国国家标准局(American National Standards Institute,简称 ANSI)成立了一个委员会,专门来制定 C语言标准。1989 年 C语言标准被批准,被称为 ANSI X3.159-1989 "Programming Language C"。这个版本的 C语言标准通常被称为 ANSI C。又由于这个版本是 89 年完成制定的,因此也被称为 C89

后来 ANSI 把这个标准提交到 ISO(国际化标准组织),1990 年被 ISO 采纳为国际标准,称为 ISO C。又因为这个版本是1990年发布的,因此也被称为 C90

ANSI C(C89)与 ISO C(C90)内容基本相同,主要是格式组织不一样。

因为 ANSI 与 ISO 的C标准内容基本相同,所以对于C标准,可以称为 ANSI C,也可以说是 ISO C,或者 ANSI / ISO C。以后大家看到 ANSI C、ISO C、C89、C90,要知道这些标准的内容都是一样的。

目前常用的编译器,例如微软编译器、GCC、LLVM/Clang 等,都能很好地支持 ANSI C 的内容。

C99标准

在 ANSI C 标准确立之后,C语言的规范在很长一段时间内都没有大的变动。1995 年C程序设计语言工作组对C语言进行了一些修改,增加了新的关键字,编写了新的库,取消了原有的限制,并于 1999 年形成新的标准——ISO/IEC 9899:1999 标准,通常被成为 C99

但是这个时候的C语言编译器基本已经成熟,各个组织对 C99 的支持所表现出来的兴趣不同。当 GCC 和其它一些商业编译器支持 C99 的大部分特性的時候,微软和 Borland 却似乎对此不感兴趣,或者说没有足够的资源和动力来改进编译器,最终导致不同的编译器在部分语法上存在差异。

例如,ANSI C 规定,局部变量要在函数开头定义,而 C99 取消了这个限制,变量可以在任意位置定义,我们将在《C语言变量的定义位置以及初始值》一节中详细介绍。

C11标准

C11 标准由国际标准化组织(ISO)和国际电工委员会(IEC) 旗下的C语言标准委员会于 2011 年底正式发布,支持此标准的主流C语言编译器有 GCC、LLVM/Clang、Intel C++ Compile 等。

C11 标准主要增加了以下内容:
  • 增加了安全函数,例如 gets_s()、fopen_s() 等;
  • 增加了 <threads.h> 头文件以支持多线程;
  • 增加了 <uchar.h> 头文件以支持 Unicode 字符集;
  • 以及其它一些细节。

C17标准

C17 标准是 2018 年发布的 C语言最新版本,有人也称它为 C18 标准。

和 C11 相比,C17 标准的变化并不大,主要是对 C11 的修正和改进,弥补 C11 标准中存在的问题和不足。

截止到 2024 年 10 月,C17 仍是最新的 C 语言标准。

C23标准

继 C17 标准之后,下一个 C 语言标准称为 C23,预计在今年(2024年)公布,目前公布的只有 C23 的草案,感兴趣的读者可以率先去浏览。

和之前的标准相比,C23 新增了一些新特性,比如:
  • 新增了三个十进制浮点数数据类型 _Decimal32、_Decimal64 和 _Decimal128,对应的后缀是 DF、DD 和 DL。
  • 支持定义二进制变量,使用 0b 或 0B 开头。
  • 新增了一些关键字,比如 bool、true、false、nullptr 等。
  • 新增了一些预编译命令,如 #elifdef、#elifndef、#warning、#embed。
  • 允许给 enum(枚举类型)指定类型。
  • 引入了函数定义时的匿名参数。
  • 其它一些细节。

总结

现有的教程(包括书籍、视频、大学课程等)大都是针对 C89 编写的,这是 C语言的核心,后来的 C99、C11、C17 和 C23 新增的特性并不多,只是在“打补丁”。

C89、C99 和 C11 是几个比较重要的版本,建议初学者先学习 C89 和 C99,等到对 C语言了解得比较深入以后,再学习 C17、C23 这些较新的 C 语言标准。

本教程虽然基于 C99 标准,但是绝大部分内容还是 C89 的,我会在 C89 和 C99 有差异的语法上给出重点说明。
声明:当前文章为本站“玩转C语言和数据结构”官方原创,由国家机构和地方版权局所签发的权威证书所保护。

添加微信咨询 加站长微信免费领
C语言学习小册
加站长微信免费领C语言学习小册
微信ID:xiexuewu333