Linux:C语言的标准和编译器

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 。

猜你喜欢

转载自blog.csdn.net/ddk3001/article/details/50616257