2.1 C 语言
最初的 ANSI C 标准 (X3.159-1989) 于 1989 年获得批准,并且
1990年出版。该标准被批准为ISO标准
(ISO/IEC 9899:1990) 于 1990 年晚些时候。没有技术差异
在这些出版物之间,尽管 ANSI 标准的部分
被重新编号并成为 ISO 标准中的条款。 ANSI
标准,但不是 ISO 标准,也带有基本原理
文档。这个标准,在它的两种形式中,通常被称为 C89,
或偶尔作为 C90,从批准之日起。要选择这个
GCC 中的标准,使用选项之一-ansi、-std=c90 或
-std=iso9899:1990;要获得标准要求的所有诊断,您还应该指定-pedantic(或-pedantic-errors,如果
你希望它们是错误而不是警告)。查看选项
控制 C 方言。
1990 ISO C 标准中的错误在两个技术中得到纠正
1994 年和 1996 年发表的勘误表。GCC 不支持
未修正的版本。
1990 年标准的修订版于 1995 年发布。这
修正在语言中添加了二合字母和__STDC_VERSION__,但是
否则与图书馆有关。该修正案通常称为
AMD1;修订后的标准有时称为 C94 或 C95。选择
GCC 中的这个标准,使用选项-std=iso9899:199409(与,至于
其他标准版本,-pedantic 接收所有需要的
诊断)。
ISO C 标准的新版本于 1999 年作为 ISO/IEC 发布
9899:1999,俗称C99。 (在开发过程中,草稿
这个标准版本的版本被称为 C9X。)GCC 有
基本上完全支持这个标准版本;看
http://gcc.gnu.org/c99status.html 了解详情。要选择这个
标准,使用-std=c99 或-std=iso9899:1999。
1999 ISO C 标准中的错误在三个技术中得到纠正
2001、2004 和 2007 年发表的勘误表。GCC 不支持
未修正的版本。
C 标准的第四个版本,称为 C11,发布于
2011 年作为 ISO/IEC 9899:2011。 (在开发过程中,此草案
标准版本被称为 C1X。)
完全支持此标准,通过-std=c11 启用或
-std=iso9899:2011。集成了更正的版本称为 C17,支持 -std=c17 或 -std=iso9899:2017;这
更正也适用于-std=c11,唯一的区别
选项之间是__STDC_VERSION__ 的值。
默认情况下,GCC 为 C 语言提供了一些扩展,在
极少数情况下会与 C 标准冲突。请参阅 C 的扩展
语言家族。作为 C99 标准一部分的一些特性是
在 C90 模式下被接受为扩展,以及一些属于 C90 模式的功能
C11 标准被接受为 C90 和 C99 模式的扩展。采用
上面列出的-std 选项中的一个会禁用这些扩展
与所选的 C 标准版本冲突。您还可以选择一个
使用-std=gnu90 显式扩展的 C 语言版本(对于 C90
带有 GNU 扩展),-std=gnu99(对于带有 GNU 扩展的 C99)或
-std=gnu11(适用于带有 GNU 扩展的 C11)。
如果没有给出 C 语言方言选项,则默认为
-std=gnu11.
ISO C 标准(在第 4 条中)定义了两类符合
执行。符合要求的托管实现支持整个
标准包括所有图书馆设施;符合的
独立实施只需要提供某些
图书馆设施:<float.h>、<limits.h>、<stdarg.h> 和
<stddef.h>;从 AMD1 开始,还有<iso646.h> 中的那些;从 C99 开始,也
<stdbool.h> 和 <stdint.h> 中的那些;从 C11 开始,还有那些在
<stdalign.h> 和 <stdnoreturn.h>。此外,复杂类型,添加在
C99,独立实现不需要。
该标准还为程序定义了两种环境:
独立环境,所有实现都需要,并且
可能没有超出独立要求的图书馆设施
实现,其中处理程序启动和终止
是实现定义的;和托管环境,这不是
必需,其中提供所有图书馆设施并启动
是通过函数int main (void) 或int main (int, char *[])。一个
OS 内核是独立运行的程序示例
环境;使用操作系统功能的程序是
在托管环境中运行的程序示例。
GCC 旨在用作符合标准的独立式
实现,或作为符合托管的编译器
执行。默认情况下,它充当托管的编译器
实现,将__STDC_HOSTED__ 定义为 1 并假设当
使用 ISO C 函数的名称,它们具有定义的语义
在标准中。使其充当符合要求的独立式
独立环境的实现,使用选项
-ffreestanding;然后它将__STDC_HOSTED__ 定义为0,并且不对标准中函数名称的含义做出假设
库,但下面提到的例外情况。要构建操作系统内核,您可以
仍然需要自己安排链接和启动。
请参阅控制 C 方言的选项。
GCC 不提供仅托管所需的库设施
实现,也不是 C99 所需的所有设施
所有平台上的独立实现。使用设施
对于托管环境,您需要在其他地方找到它们(例如,
在 GNU C 库中)。请参阅标准库。
GCC 使用的大多数编译器支持例程都存在于
libgcc,但也有一些例外。 GCC 需要独立的
环境提供 memcpy、memmove、memset 和 memcmp。最后,如果
使用了__builtin_trap,并且目标没有实现陷阱模式,那么 GCC 会发出一个调用来中止。
有关技术勘误、基本原理文档和
有关在线可用的 C 历史的信息,请参阅
http://gcc.gnu.org/readings.html