前言:
而今兄弟们对“c语言的主要标准”都比较注重,咱们都想要剖析一些“c语言的主要标准”的相关内容。那么小编在网上搜集了一些对于“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,什么时候完成未定。各个标准的制定里程碑如下图所示:
各个版本的详细名称如下表所示,可参考官方网站下载标准文档:
其中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标准中提供了大量内建函数