1. C语言的标准
1.1 K&R C
1973年,Dennis M. Ritchie设计和实现了C语言,从那以后使用者逐渐增加。
1978年,Kernighan 和 Ritchie 合著了《The C Programming Language》,这本书定义的C语言被称为 K&R C 。
1.2 标准 C
随着C语言使用日益广泛,出现了许多新问题,人们迫切希望对C语言进行标准化。
第一个标准:C89
1983年,ANSI成立了一个委员会X3J11,对C语言进行标准化。
1989年,ANSI 批准了第一个C语言标准 X3.159-1989,并于1990年公布,被称为 ANSI C、C89 或 C90。
1990年,这个标准又被批准为ISO标准:ISO/IEC 9899:1990 。
ANSI C 标准被 ISO 采纳,并且 ISO 发布的修订版也被 ANSI 采纳,因此ANSI标准和ISO标准实际上没有技术区别。这些名称的含义是相同的:ANSI C、ISO C、标准C。
1994年和1996年,ISO发布了两个技术更正,更正了1990 ISO C标准中的错误。
第二个标准:C94
1995年,ISO发布了1990 ISO C标准的一个补充,称为AMD1。
扩充后的标准被称为 C94 或 C95。
第三个标准:C99
1999年,ISO发布了一个新版本的ISO C标准:ISO/IEC 9899:1999,称为C99。
2001年、2004年和2007年,ISO发布了三个技术更正,更正了1999 ISO C标准中的错误。
第四个标准:C11
2011年,ISO发布了一个新版本的ISO C标准:ISO/IEC 9899:2011,称为C11。
C11 是 C语言的最新标准。
1.3 GNU C
1984年,Richard Stallman 发起了 GNU 计划,它的目标是开发一个完整且自由的Unix-like操作系统(GNU系统)。
GNU系统是一个完整的操作系统,包括操作系统内核和各种工具软件。
各种GNU系统的变种(例如Redhat、Ubuntu等)已经被广泛使用,它们使用的操作系统内核都是Linux。
虽然这些系统经常被称为Linux,但准确地说,它们是GNU/Linux系统。
GNU在编写Linux时扩展了标准C,称为GNU C。
GNU C的扩展详见:Extensions to the C Language Family
GNU C也称为Linux C,一般用于Linux上的开发,而标准C可以跨平台。
GNU C使用的编译器是GCC。
2. C语言的编译器
2.1 编译器对标准C的支持
ANSI C是C语言的标准,同时规定了C运行期库例程的标准。
多数C代码是基于ANSI C编写,广泛使用的编译器都支持ANSI C。
任何仅仅使用标准C,并且没有任何硬件依赖的代码,能保证在任何平台上用遵循C标准的编译器编译成功。
C语言的编译器都在ANSI C的基础上做了扩充,加入了自己的规则和库之类的内容。
下列编译器支持 ANSI C :
- GCC
- Microsoft Visual C++
- ARM RealView
2.2 GCC对标准C的支持
参考:GCC在线文档
缺省情况下,GCC为C语言提供了一些扩展,这些扩展在极少的情况下会与C标准有冲突。
当扩展与所选C标准版本有冲突时,可以使用选项去除这些扩展。
- 为使用C89标准,使用选项之一:-std=iso9899:1990 、-std=c90 、-ansi
- 为使用C94标准,使用这个选项:-std=iso9899:199409
- 为使用C99标准,使用选项之一:-std=iso9899:1999 、-std=c99
- 为使用C11标准,使用选项之一:-std=iso9899:2011 、-std=c11
还可以用下列选项明确指定使用C语言的一个扩展版本:
- -std=gnu90 具有GNU扩展的C90
- -std=gnu99 具有GNU扩展的C99
- -std=gnu11 具有GNU扩展的C11
在gnu90中接受了一些C99和C11的特性,在gnu99中接受了一些C11的特性。
如果没有指定上面所列的C语言方言选项,缺省情况下使用的是 –std=gnu90 。