我们在很多地⽅都有看到过K&R C、ANSI C、ISO C、C89、C99、C11等标准,具体有什么不同呢?(⽂末有个很好的实例)
1978年,丹尼斯·⾥奇(Dennis Ritchie)和布莱恩·柯林汉(Brian Kernighan)合作出版了《C程序设计语⾔》的第⼀版。书中介绍
的C语⾔标准也被称作“K&R C”。
什么是ANSI C、ISO C、C89、C90标准?
随着C语⾔使⽤得越来越⼴泛,出现了许多新问题,⼈们⽇益强烈地要求对C语⾔进⾏标准化。1983年,美国国家标准协会(ANSI)组成
了⼀个委员会,X3J11,为了创⽴ C 的⼀套标准。经过漫长⽽艰苦的过程,该标准于1989年完成,这个版本的语⾔经常被称作ANSI C,
或有时称为C89(为了区别C99)。在1990年,ANSI C标准(带有⼀些⼩改动)被美国国家标准协会(ANSI)采纳为ISO/IEC
9899:1990。这个版本有时候称为C90或者ISO C。综上,ANSI C、ISO C、C89、C90其实是同⼀种标准。
2000年3⽉,ANSI 采纳了 ISO/IEC 9899:1999 标准。这个标准通常指C99。 C99新增了⼀些特性,如:⽀持不定长的数组,即数组
长度可以在运⾏时决定。变量声明不必放在语句块的开头,for语句提倡写成for(int i=0;i<100;++i) 的形式,即i只在for语句块内部有效。
C11标准是C语⾔标准的第三版(2011年由ISO/IEC发布),前⼀个标准版本是C99标准。与C99相⽐,C11有哪些变化呢?
对齐处理: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结构体时间单位为毫秒。
评论0