四种标准
- k&RC (1978)
- C89 (1989)
- C99 (1999)
- C11 (2011)
k&RC 主要特色
- 结构(struct)类型
- 长整数(long int)类型
- 无符号整数(unsigned int)类型
- 将 =+ 、=- 改成 += 、-=
ANSI C 和ISO C
C 的 第一个标准是由ANSI 发布的。
C89与ANSI C 的区别
- 增加真正的标准库
- 新的预处理命令与特性
- 函数原型允许在函数申明中指定参数类型
- 一些新的关键字,包括 const、volatile 与 signed 宽字符、宽字符串与字节多字符
- 对约定规则、声明和类型检查的许多小改动与澄清
C99 与C89的区别
- 支持不定长的数组,即数组长度可以在运行时决定
- 变量声明不必放在语句块的开头,for 语句提倡写成 for(int i=0;i<100;++i) 的形式,即i 只在 for 语句块内部有效
- 初始化结构的时候允许对特定的元素赋值
- 允许编译器化简非常数的表达式、
- 取消了函数返回类型默认为 int 的规定
C11 与C99 的区别
- 对齐处理 :
alignof(T)返回T的对齐方式,aligned_alloc()以指定字节和对齐方式分配内存,头文件<stdalign.h>定义了这些内容 - _ Noreturn :_ Noreturn是个函数修饰符,位置在函数返回类型的前面,声明函数无返回值,有点类似于gcc的attribute((noreturn)),后者在声明语句尾部。
- _Generic:
_Generic支持轻量级范型编程,可以把一组具有不同类型而却有相同功能的函数抽象为一个接口。 - _Static_assert():
_Static_assert(),静态断言,在编译时刻进行,断言表达式必须是在编译时期可以计算的表达式,而普通的assert()在运行时刻断言。 - 安全版本的几个函数:
gets_s()取代了gets(),原因是后者这个I/O函数的实际缓冲区大小不确定,以至于发生常见的缓冲区溢出攻击,类似的函数还有其它的。 - fopen()新模式:fopen()增加了新的创建、打开模式“x”,在文件锁中比较常用。
- 匿名结构体、联合体。
- 多线程:头文件<threads.h>定义了创建和管理线程的函数,新的存储类修饰符_Thread_local限定了变量不能在多线程之间共享
- _Atomic类型修饰符和头文件<stdatomic.h>
- 改进的Unicode支持和头文件<uchar.h>
- quick_exit():
又一种终止程序的方式,当exit()失败时用以终止程序 - 复数宏,浮点数宏
- time.h新增timespec结构体,时间单位为纳秒,原来的timeval结构体时间单位为毫秒。