1.6语言标准
目前,有许多 C 实现可用。在理想情况下,编写 C 程序时,假设该程序
中未使用机器特定的编程技术,那么它的运行情况在任何实现中都应该相
同。要在实践中做到这一点,不同的实现要遵循同一个标准。
C 语言发展之初,并没有所谓的 C 标准。 1987 年,布莱恩 · 柯林汉( Brian
Kernighan )和丹尼斯 · 里奇( Dennis Ritchie )合著的 The C Programming
Language (《 C 语言程序设计》)第 1 版是公认的 C 标准,通常称之为 K&R C
或经典 C 。特别是,该书中的附录中的 “C 语言参考手册 ” 已成为实现 C 的指导
标准。例如,编译器都声称提供完整的 K&R 实现。虽然这本书中的附录定
义了 C 语言,但却没有定义 C 库。与大多数语言不同的是, C 语言比其他语言
更依赖库,因此需要一个标准库。实际上,由于缺乏官方标准, UNIX 实现
提供的库已成为了标准库。
1.6.1第1个ANSI/ISO C标准
随着 C 的不断发展,越来越广泛地应用于更多系统中, C 社区意识到需
要一个更全面、更新颖、更严格的标准。鉴于此,美国国家标准协会
( ANSI )于 1983 年组建了一个委员会( X3J11 ),开发了一套新标准,并
于 1989 年正式公布。该标准( ANSI C )定义了 C 语言和 C 标准库。国际标准
化组织于 1990 年采用了这套 C 标准(
ISO C )。 ISO C 和 ANSI C 是完全相同的
标准。 ANSI/ISO 标准的最终版本通常叫作 C89 (因为 ANSI 于 1989 年批准该标
准)或 C90 (因为 ISO 于 1990 年批准该标准)。另外,由于 ANSI 先公布 C 标
准,因此业界人士通常使用 ANSI C 。
在该委员会制定的指导原则中,最有趣的可能是:保持 C 的精神。委员
会在表述这一精神时列出了以下几点:
信任程序员;
不要妨碍程序员做需要做的事;
39 保持语言精练简单;
只提供一种方法执行一项操作;
让程序运行更快,即使不能保证其可移植性。
在最后一点上,标准委员会的用意是:作为实现,应该针对目标计算机
来定义最合适的某特定操作,而不是强加一个抽象、统一的定义。在学习 C
语言过程中,许多方面都反映了这一哲学思想。
1.6.2 C99标准
1994 年, ANSI/ISO 联合委员会( C9X 委员会)开始修订 C 标准,最终发
布了 C99 标准。该委员会遵循了最初 C90 标准的原则,包括保持语言的精练
简单。委员会的用意不是在 C 语言中添加新特性,而是为了达到新的目标。
第 1 个目标是,支持国际化编程。例如,提供多种方法处理国际字符集。第 2
个目标是, “ 调整现有实践致力于解决明显的缺陷 ” 。因此,在遇到需要将 C
移至 64 位处理器时,委员会根据现实生活中处理问题的经验来添加标准。第
3 个目标是,为适应科学和工程项目中的关键数值计算,提高 C 的适应性,
让 C 比 FORTRAN 更有竞争力。
这 3 点(国际化、弥补缺陷和提高计算的实用性)是主要的修订目标。
在其他方面的改变则更为保守,例如,尽量与 C90 、 C++ 兼容,让语言在概
念上保持简单。用委员会的话说: “„„ 委员会很满意让 C++ 成为大型、功能
强大的语言 ” 。
C99 的修订保留了 C 语言的精髓, C 仍是一门简洁高效的语言。本书指出
了许多 C99 修改的地方。虽然该标准已发布了很长时间,但并非所有的编译
器都完全实现 C99 的所有改动。因此,你可能发现 C99 的一些改动在自己的
系统中不可用,或者只有改变编译器的设置才可用。
1.6.3 C11标准
维护标准任重道远。标准委员会在 2007 年承诺 C 标准的下一个版本是
40 C1X , 2011 年终于发布了 C11 标准。此次,委员会提出了一些新的指导原
则。出于对当前编程安全的担忧,不那么强调 “ 信任程序员 ” 目标了。而且,
供应商并未像对 C90 那样很好地接受和支持 C99 。这使得 C99 的一些特性成为
C11 的可选项。因为委员会认为,不应要求服务小型机市场的供应商支持其
目标环境中用不到的特性。另外需要强调的是,修订标准的原因不是因为原
标准不能用,而是需要跟进新的技术。例如,新标准添加了可选项支持当前
使用多处理器的计算机。对于 C11 标准,我们浅尝辄止,深入分析这部分内
容已超出本书讨论的范围。
注意
本书使用术语 ANSI C 、 ISO C 或 ANSI/ISO C 讲解 C89/90 和较新标准共有
的特性,用 C99 或 C11 介绍新的特性。有时也使用 C90 (例如,讨论一个特性
被首次加入 C 语言时)。