C语言标准,ANSI C,ISO C,GNU C

丹尼斯·里奇(Dennis Ritchie)于1969年在 AT&T 贝尔实验室编写Unix 操作系统,实现该系统的程序语言就是C语言,因此里奇是C语言之父与UNIX之父,后面的Linux、Window、MAC OS都是基于UNIX进行开发的。

1、 K&R C标准

1978年,布莱恩·柯林汉(Brian Kernighan)和丹尼斯·里奇(Dennis Ritchie)出版了《The C Programming Language》这本书,作为C语言的非正式标准,称为K&R标准。

该标准对前期的C语法做了些改进,比如:把运算符“=+“和”=-“,改为”+=“和”-=“,避免赋值运算int i = -10与算术运算i =- 10产生混淆。

但是与现在的标准C存在很大的差异,比如:1、函数定义可省略返回类型:function(){};2、函数参数先列出形参的标识符,然后在函数声明的后面紧跟着对形参标识符的完整声明,最后是函数体:void function(a,b)int a;int b;{}。这些用法在现行的标准中已经被弃用了。

2、 ANSI C标准

当时的PC制造上IBM和Microsoft都在使用C语言,因此,美国国家标准协会ANSI(American National Standards Institute)制定了第一个 C 标准,在1989年被正式采用,官方名称为(American National Standard X3.159-1989),也称为(ANSI X3.159-1989),简称为 C89,也称为 ANSI C。

3、 ISO C标准

在1990年,ANSI C标准作了一些改进,被国际标准化组织 ISO( International Organization for Standardization)采纳,官方名称为ISO/IEC 9899:1990, 简称为称为ISO C,也称为C90。因为区别很小,因此,C89和C90通常指同一种语言,与传统C语言K&R标准对比, ANSI/ISO标准C语言的改进了很多。

4、 C95标准

在1995年,对C89标准作了一个修订与补充,产生了一个C95标准,官方名称为:ISO/IEC 9899:1990/AMD 1:1995,但并不是一个真正的标准,主要改动如下:

5、 C99标准

在1999年,C语言的标准化委员会将不断改进的C语言, 收纳为新的标准,官方名称为 ISO/IEC 9899: 1999,简称为 C99 标准,严格上讲是C语言的第二个官方版本,C99 标准引入了许多特性。

6、 C11标准

     在2011年,C语言标准委员会又重新开始将之前几年修订的C语言进行收纳,制定为新的标准,官方名称为ISO/IEC 9899: 2011,简称C11,是C语言的第三个官方版本,该版本作了如下改进:

7、 C17标准

在2018年,C语言标准委员会又重新制定为新的标准,官方名称为ISO/IEC 9899:2018,简称C17(也被称为为 C18),该版本对C11进行了补充和修正。

8、 下一个标准

下一个标准还在起草制定阶段,官方名称为ISO/IEC WD 9899,什么时候完成未定。各个标准的制定里程碑如下图所示:

各个版本的详细名称如下表所示,可参考官方网站下载标准文档:

http://www.open-std.org/jtc1/sc22/wg14/www/projects#9899

 其中ANSI/ISO/IEC是三个标准制定化组织:

9、 GNU C标准

在1983年,理查德·马修·斯托曼(Richard Matthew Stallman, RMS),自由软件运动的精神领袖、GNU计划以及自由软件基金会(Free Software Foundation)的创立者、著名黑客,在其领导下,创立了GNU C标准,该标准应用于Linux操作系统,但是Linux操作系统也支持标准C;因此标准C是跨平台的,在Window和Linux下均支持,GNU C标准一般在Linux下使用。Linux 上可用的 C 编译器是 GCC 编译器,GCC编译器默认支持GNU C标准,同时也支持标准C,可以根据编译选项决定使用哪个C标准进行编译:

“c90标准: -std=c90,C99标准: -std=c99,C11标准: -std=c11”。

使用c99标准编译.c文件的命令行如下:

gcc -std=c99 main.c -o main.exe

GNU标准对标准C进行了一系列的扩展,以增强标准的功能,如下所示的区别:

(1).GNU C标准支持零长度和变量长度数组;

(2).case范围:GNU C支持case x...y这样的语法,区间[x,y]中的数都会满足这个case的条件;

(3).语句表达式:GNU C把包含在括号中的复合语句看成是一个表达式,称为语句表达式,它可以出现在任何允许表达式的地方。可以在语句表达式中使用原本只能在复合语句中使用的循环、局部变量等。

(4).typeof关键字:typeof(x)语句可以获取x的类型,因此,可以使用typeof重新定义min这个宏。


(5).可变参数宏

 

(6).标号元素:ANSI C标准中,要求数组或结构体的初始化值必须以固定的顺序出现。但是,在GNU C中通过指定索引或结构体成员名,允许初始化值以任意顺序出现。指定数组索引的方法是在初始化值前添加"[INDEX] =",也可以使用"[FIRST...LAST] ="的格式指定一个范围。

(7).当前函数名:GNU C预定义了两个标识符保存当前函数的名字,__FUNCTION__即函数在源代码中的名字。__PRETTY_FUNCTION__保存带有语言特色的名字,C99已经支持__func__宏,因此建议在Linux编程中不再使用__FUNCTION__,而转而使用__func__。

(8).特殊属性声明:GNU C标准允许声明函数、变量和类型的特殊属性,以便于手动优化代码和定制代码检查的方法。要指定一个声明的属性,只需要在声明后添加__attribute__(ATTRIBUTE)。其中,ATTRIBUTE为属性说明,如果存在多个属性,则以逗号分隔开。

GNU C支持noreturn、format、p、aligned、packed等十多个属性。

(9).内建函数:GNU C标准中提供了大量内建函数

 以上,参考部分博客的文章理解总结!!!

  • 11
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值