C语言的三套标准:C89、C99、C11

C语言最初由 Dennis Ritchie 于 1969 年到 1973 年在 AT&T 贝尔实验室里开发出来 , 主要用于重新实现 Unix 操作系统 。此时 , C语言又被称为 K&R C 。其中 , K 表示 Kernighan 的首字母 , 而 R 则是 Ritchie 的首字母 。

C语言的三套标准:C89、C99、C11

文章插图
 
差异K&R C语言与后来标准化的C语言有很大差异 , 比如:
  • 如果函数返回类型为 int , 则 int 可省:
  • int my_function(){ }
  • 也可以写成
  • my_function(){ }
  • 编译器不会有任何警告 , 更不会报错 。
  • 还有现在看来比较奇葩的函数定义 , 像我们现在定义这么一个函数:
  • void my_function(int a, char*p) {}
  • 如果是用 K&R C 语法定义的话要写成:
  • void my_function(a , p)int a; char*p; {}
  • K&R 的C语法中 , 定义一个函数时 , 其形参列表先列出形参的标识符 , 然后在函数声明的后面紧跟着对形参标识符的完整声明 , 最后是函数体 。这在现行标准中已经被逐步废弃使用了 。
另外 , 当时的第一本C语言专业书《The C Programming Language》也并非一个正式的编程语言规范 , 但被用了许多年 。
C90 标准由于C语言被各大公司所使用(包括当时处于鼎盛时期的 IBM PC) , 因此到了 1989 年 , C语言由美国国家标准协会(ANSI)进行了标准化 , 此时C语言又被称为 ANSI C 。
而仅过一年 , ANSI C 就被国际标准化组织 ISO 给采纳了 。此时 , C语言在 ISO 中有了一个官方名称——ISO/IEC 9899: 1990 。其中:
  • 9899 是C语言在 ISO 标准中的代号 , 像 C++ 在 ISO 标准中的代号是 14882;
  • 而冒号后面的 1990 表示当前修订好的版本是在 1990 年发布的 。
对 于ISO/IEC 9899: 1990 的俗称或简称 , 有些地方称为 C89 , 有些地方称为 C90 , 或者 C89/90 。不管怎么称呼 , 它们都指代这个最初的C语言国际标准 。
这个版本的C语言标准作为 K&R C 的一个超集(即 K&R C 是此标准C的一个子集) , 把后来引入的许多非官方特性也一起整合了进去 。其中包括了从 C++ 借鉴的函数原型(Function Prototypes) , 指向 void 的指针 , 对国际字符集以及本地语言环境的支持 。在此标准中 , 尽管已经将函数定义的方式改为现在我们常用的那种方式 , 不过K&R的语法形式仍然兼容 。
C99标准在随后的几年里 , C语言的标准化委员会又不断地对C语言进行改进 , 到了 1999 年 , 正式发布了 ISO/IEC 9899: 1999 , 简称为 C99 标准 。
C99 标准引入了许多特性 , 包括内联函数(inline functions)、可变长度的数组、灵活的数组成员(用于结构体)、复合字面量、指定成员的初始化器、对IEEE754浮点数的改进、支持不定参数个数的宏定义 , 在数据类型上还增加了 long long int 以及复数类型 。
毫不夸张地说 , 即便到目前为止 , 很少有C语言编译器是完整支持 C99 的 。像主流的 GCC 以及 Clang 编译器都能支持高达90%以上 , 而微软的 Visual Studio 2015 中的C编译器只能支持到 70% 左右 。
C11标准2007 年 , C语言标准委员会又重新开始修订C语言 , 到了 2011 年正式发布了 ISO/IEC 9899: 2011 , 简称为 C11 标准 。
C11标准新引入的特征尽管没 C99 相对 C90 引入的那么多 , 但是这些也都十分有用 , 比如:字节对齐说明符、泛型机制(generic selection)、对多线程的支持、静态断言、原子操作以及对 Unicode 的支持 。

【C语言的三套标准:C89、C99、C11】


    推荐阅读