游戏开发工具

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(),以及 头文件 <stdalign.h>。

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,头文件 <threads.h>,里面包含线程的创建和管理函数(比如 thrd_create(),thrd_exit()),mutex (比如 mtx_lock(),mtx_unlock())等等。

9、_Atomic类型修饰符和 头文件 <stdatomic.h>。

10、带边界检查(Bounds-checking)的函数接口,定义了新的安全的函数,例如 fopen_s(),strcat_s() 等等。

11、改进的 Unicode 支持,新的头文件 <uchar.h> 等。

12、新增 quick_exit() 函数,作为第三种终止程序的方式,当 exit() 失败时可以做最少的清理工作(deinitializition)。

13、创建复数的宏, CMPLX()。

14、更多浮点数处理的宏 。

15、struct timespec 成为 time.h 的一部分,以及宏 TIME_UTC,函数 timespec_get()。