目录
C89 C99 C11差异
C89
1978年,Brian Kernighan和Dennis Ritchie共同撰写了《The C Programming Language》的第1版,该著作简称为“K&R”。书中对C语言的语法进行了规范化描述,书末的参考指南则给出了当时C语言的完整定义,这也成为当时C语言事实上的标准,此标准称为“K&R C”。
但是随着C语言在多个领域的推广和应用,一些新的特性不断被各种编译器实现并添加进来。于是建立一个新的“无歧义,与具体平台无关的C语言定义”就成为越来越重要的事情。
1983年,美国国家标准委员会ANSI开始起草关于C语言的标准草案。1989年,ANSI正式通过C语言标准草案,至此该标准成为美国国家标准,此标准也称为C89标准。
C89改进
增加了新特性——原型。原型是函数声明的扩展,它使得编译器很容易根据函数的定义检查函数的用法。
增加了一些新的关键字,如enum、const、volatile、signed与void。如下表
auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void default goto sizeof volatile do if static while
除此之外,C89还做了许多其他的改进,如增强了预处理指令,定义了相关的宏,允许将结构本身作为参数传递给函数,从“无符号保留”转到“值保留”等。
PS:1990年,ISO批转ANSI C成为国际标准,于是ISO C(又称为C90)诞生。和C89相比,技术上是完全一样的
C99
1999年,ANSI和ISO又通过了最新版本的C语言标准和技术勘误文档,该标准被称为C99。这里需要说明的是,与C89不同,并非市面上所有的编译器都支持C99,并且有的编译器只支持C99的部分新特性。
C99改进
相对于C89,C99主要做了以下几方面的改进:
增加了restrict与inline关键字
新增Bool、Complex与_Imaginary 3种数据类型,如C99中定义的复数类型为:float_Complex、float_Imaginary、double_Complex、double_Imaginary、long double_Complex与long double_Imaginary
增强数组的功能,支持可变长数组等
支持复合赋值
增强预处理程序,如引入_Pragma运算符,并增加了一些内部宏等
支持柔性数组结构成员,即允许结构中的最后一个元素是未知大小的数组
C11
由于技术的发展日新月异,因此虽然C99还没有得到完全支持,但在2007年,标准委员会就又开始起草新的C语言标准来取代现有的C99标准,该标准命名为C1X,C1X是一个非正式名字。2011年12月,ANSI正式采纳了ISO/IEC 9899:2011标准,即C11标准。
C11改进
相对于C99,C11主要做了以下几方面的改进:
采用新的对齐规范,包括Alignas说明符、Alignof运算符、aligned_alloc函数与<stdalign.h>头文件
增加_Noreturn函数标记
增加_Generic关键词
增加静态断言_Static_assert()
删除gets()函数,C99中已经将此函数标记为过时,推荐新的替代函数gets_s()
采用新的fopen()模式
增加匿名结构体/联合体
支持多线程技术,包括_Thread_local与头文件<threads.h>
增加_Atomic类型修饰符和头文件<stdatomic.h>
带边界检查(bounds-checking)的函数接口,定义了新的安全的函数,例如fopen_s()、strcat_s()等
改进Unicode支持与头文件<uchar.h>
增加quick_exit()函数作为第三种终止程序的方式
可以创建复数的宏
增加更多处理浮点数的宏
struct timespec成为time.h的一部分,以及宏TIME_UTC和函数timespec_get()