c语言现行的标准,C语言的标准

  • Post author:
  • Post category:其他


from: http://blog.csdn.net/gogor/article/details/4562660

1.ANSI/ISO C

ANSI C是C语言的标准,任何C语言的编译器都在ANSI C的基础上扩充。

1990年,国际化标准组织ISO(Intrernational StandardOrganization)接受了ANSI C(C89)为ISO C的标准(ISO9899-1990)。1994年,ISO修订了C语言的标准。目前流行的C语言编译系统大多是以ANSI C为基础进行开发的,但不同版本的C编译系统所实现的语言功能和语法规则有略有差别。

在ANSI标准化后,C语言的标准在一段相当的时间内都保持不变,尽管C++继续在改进。(实际上,Normative Amendment1在1995年已经开发了一个新的C语言版本。但是这个版本很少为人所知。)标准在90年代才经历了改进,这就是ISO9899:1999(1999年出版)。这个版本就是通常提及的C99。它被ANSI于2000年三月采用。

2.GNU C

gcc(GNU CC)是一个功能非常强大的跨平台C编译器。

它对标准C(ANSI/ISO C)进行了很多扩展,这些扩展对优化目标代码布局安全性的检测方面提供很强的支持,我们把支持GNU扩展的C语言称为GNU C。

Linux内核代码使用了大量的GNU C扩展,以至于唯一能够编译Linux内核的编译器就是gcc。下面是相对于标准C,GNU C扩展的一些特殊之处:

1.允许零长度数组

GNU C允许零长度数组,在定义变长对象的头结构时,这个特性非常有用。

struct var_data s

{

int len;

char data[0];

};

char data[0]仅仅意味着程序中通过var_data的结构体实例的data[index]成员可以访问len之后的第index个地址,并没有为data[0]分配内存。

假设struct var_data的数据域保存在struct var_data紧接着的内存区域,通过如下代码可以遍历这些数据:

struct var_data s;

for (i=0;i

{

printf(“%02x”,s.data[i]);

}

2、case范围

GNU C 支持case x…y 这样的语法,区间[x,y]的数都会满足这个case的条件.

switch(c)

{

case ‘0’…’9′: c-=’0′;

break;

<