C语言三大标准C89,C99和C11

C89 标准

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

C99 标准

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

C99对C89的改变

1、增加restrict指针
2、inline(内联)关键字
3、新增数据类型 _Bool 
4、对数组的增强,可变长数组,数组声明中的类型修饰符等
5、单行注释
6、分散代码与声明
7、预处理程序的修改
  a、变元列表
  b、_Pragma运算符
  c、内部编译指令
  d、新增的内部宏
8、for语句内的变量声明  
9、复合赋值
10、柔性数组结构成员
11、指定的初始化符
12、printf()和scanf()函数系列的增强
13、C99新增的库
14、__func__预定义标识符
15、其它特性的改动
  放宽的转换限制
  不再支持隐含式的int规则
  删除了隐含式函数声明
  对返回值的约束
  扩展的整数类型
  对整数类型提升规则的改进

C11 标准

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

C11相比C99的变化

  1. 对齐处理操作符 alignof,函数 aligned_alloc(),以及 头文件
  2. _Noreturn 函数标记,类似于 gcc 的 attribute((noreturn))。
  3. _Generic 关键词,有点儿类似于 gcc 的 typeof。
  4. 静态断言( static assertions),_Static_assert(),在解释 #if 和 #error 之后被处理。
  5. 删除了 gets() 函数,C99中已经将此函数被标记为过时,推荐新的替代函数 gets_s()。
  6. 新的 fopen() 模式,(“…x”)。类似 POSIX 中的 O_CREAT|O_EXCL,在文件锁中比较常用。
  7. 匿名结构体/联合体。
  8. 多线程支持,包括:_Thread_local,头文件 ,里面包含线程的创建和管理函数(比如 thrd_create(),thrd_exit()),mutex (比如 mtx_lock(),mtx_unlock())等等。
  9. _Atomic类型修饰符和 头文件
  10. 带边界检查(Bounds-checking)的函数接口,定义了新的安全的函数,例如 fopen_s(),strcat_s() 等等。
  11. 改进的 Unicode 支持,新的头文件 等。
  12. 新增 quick_exit() 函数,作为第三种终止程序的方式,当 exit() 失败时可以做最少的清理工作(deinitializition)。
  13. 创建复数的宏, CMPLX()。
  14. 更多浮点数处理的宏 。
  15. struct timespec 成为 time.h 的一部分,以及宏 TIME_UTC,函数 timespec_get()。

参考资料:
C89(C90)、C99、C11——C语言的三套标准
C89标准和C99标准C11标准的区别
C语言的三套标准:C89、C99和C11

你可能感兴趣的:(嵌入式LinuxC培训)