GCC manual翻译(4.4.2) -- 2 GCC 支持的语言标准

来源:互联网 发布:vmware 性能优化 编辑:程序博客网 时间:2024/05/12 23:06

2 GCC 支持的语言标准

每种 GCC 编译的语言都有标准, GCC 会尽量遵循该标准的多种版本,但是可能会有一些标准外的例外以及扩展。

 

2.1 C 语言

GCC 支持 3 个版本的 C 标准,尽管对最新版本的支持还不完整。

最初的 ANSI C 标准 (X3.159-1989) 在 1989 年被批准,并于 1990 年发布。稍后这个标准被接受为 ISO 标准 (ISO/IEC 9899:1990) 。虽然 ISO 标准将 ANSI 标准的某些章节重新编号并变为条款,但是两者实际上并无区别。不论是 ANSI 标准还是 ISO 标准,通常都称之为 C89 ,偶尔也因为发布日期而被叫做 C90 。 ANSI 标准 ( 非 ISO 标准 ) 同时附带了 rationale 文档。可以使用 -ansi , -std=c89 或 -std=iso9899:1990 选项指定 GCC 使用 C89 标准;如果想要获得全部的诊断信息,需加上选项 -pedantic ( 或者使用 -pedantic-errors 选项以使 wangning 变为 error) 。详情请参考 C 语言的控制选项。

1990 ISO C 标准中的错误整理了两个勘误表,分别在 1994 年和 1996 年发布。 GCC 不支持错误的版本。

C 标准的第二个版本是 1990 年标准的修正版,于 1995 年发布。这个修正版增加了连字和 __STDC_VERSION__ ,但是其他修正则是与库有关的。这个修正版通常被称为 AMD1 ;有时也被称为 C94 或 C95. 可以使用 -std=iso9899:199409 选项来指定这个版本 ( 与其他版本一样,可以使用 -pedantic 选项来得到所有的诊断信息 ) 。

新的 ISO C 标准是 1999 年发布的 ISO/IEC 9899:1999 ,通常称之为 C99 。 GCC 目前不完整的支持这个版本。详情请参考 http://gcc.gnu.org/gcc-4.4/c99status.html 。为了指定 GCC 使用这个版本的 C 标准,需要 -std=c99 或 -std=iso9899:1999 选项。 ( 在开发阶段,这个版本的草稿称之为 C9X 。 )

1999 ISO C 标准中的错误整理了三个勘误表,分别在 2001 年、 2004 年和 2007 年发布。同样的, GCC 不支持错误的版本。

默认情况下, GCC 提供了一些 C 语言的扩展,极少的几处会与 C 标准冲突。关于这些冲突请参考 “ C 语言家族的扩展 ” 一节。使用上述的 -std 选项将会关闭这些有冲突的扩展。你也可以显式的使用选项 -std=gnu89 ( 对应 C89 的 GNU 扩展 ) 或 -std=gnu99 ( 对应 C99 的 GNU 扩展 ) 来选择对应版本的扩展功能。如果没有给出 C 语言 “ 方言 ” 选项,将默认的使用 -std=gnu89 ;在未来的发布版中,当 GCC 完整的支持了 C99 后,这个默认选项将变为 -std=gnu99 。目前某些 C99 的特性作为 C89 的扩展而存在。

 

 

ISO C 标准定义了 ( 第 4 章 ) 两类符合标准的实现。其中主机实现 (confirming hosted implementation) 的实现支持完整的标准,包括库;而独立实现 (confirming freestanding implementation) 仅要求提供几个库,这些库在 <float.h>, <limits.h>, <stdarg.h>, 和 <stddef.h> 中, AMD1 版本后,增加了 <iso646.h> ,而 C99 增加了 <stdbool.h> 和 <stdint.h> 。另外, C99 中增加的复杂类型在独立的实现中不做要求。同时, ISO C 标准也定义了两种程序运行环境,独立环境要求在所有实现中存在,但是可能没有超出独立实现要求的库工具,程序如何启动和结束依赖于实现定义;另一种主机环境并不是必须的,在此环境中,要求提供所有的库工具,并且程序的启动通过函数 int main (void) 或 int main (int, char *[]) 。一个 OS kernel 就是一个独立环境,而使用操作系统的功能运行程序通常是在一个主机实现中。

GCC 的目标是作为一个实际的独立实现 (freestanding implementation) ,或在主机实现中成为一个编译器。默认情况下,它在一个主机实现中充当编译器的角色,同时定义宏 __STDC_HOSTED__ 为 1 ,并且假设当使用 ISO C 函数时,它们的语意都已经在标准中定义。如果想要 GCC 充当一个独立环境 (freestanding environment) 中的独立实现,则要使用选项 -ffreestanding ;该选项将 宏 __STDC_HOSTED__ 定义为 0 ,并且使 GCC 不对标准库中的函数名做任何的假设,除去下面列出的例外。如果要生成一个 OS kernel ,你还要自己处理链接和启动,请参考 "C 的选项控制 " 。
GCC 不提供主机实现中要求的库,也不提供 C99 独立实现中的所有工具,你需要到别的地方找到它们,例如 GNU 的 C 库。请参考 " 标准库 " 。
GCC 使用的编译器支持函数,多数都在 libgcc 中,但是有一些例外。 GCC 要求独立环境提供 memcpy , memmove , memset 和 memcmp 。最后,如果在没有实现 trap 模式的目标中使用 __builtin_trap ,则 GCC 将直接调用 abort 。
对于本文参考引用的技术勘误表、 Rationale 文档以及涉及到 C 语言历史的一些信息,均有在线文档可以查阅,请参考 http://gcc.gnu.org/readings.html 。

 

2.2 C++ 语言

GCC 支持 ISO C++ 标准 (1998) 并且对 ISO C++ 标准 (200x) 包含一些实验性的支持。

最初的 ISO C++ 标准是作为 ISO 标准 (ISO/IEC 14882 : 1998) 发布的,并在 2003 年发布了一个技术勘误表进行了修正 (ISO/IEC 14882 : 2003) 。这些标准分别对应 C++98 和 C++03 。 GCC 实现了大部分的 C++98(export 是个显著的例外 ) 以及大部分 C++03 中改变。为了使用这一标准,可以使用选项 -ansi 或 -std=c++98 ;为了获得标准要求的全部诊断信息,你还要使用选项 -pedantic( 或者使用 -pedantic-errors 以使 warning 变为 error) 。

ISO C++ 委员会目前正在制定新的 ISO C++ 标准,将命名为 C++0x ,并预计于 2009 年发布 C++0x 相对于目前的 C++ 语言有几个改变,其中的一些已经在 GCC 中以实验性的 C++0x 模式实现。 GCC 的 C++0x 模式跟踪 C++0x 标准的草稿;最新的草稿可以在 ISO C++ 委员会的网站查看 http://www.open-std.org/jtc1/sc22/wg21/ 。而 GCC 的实验性 C++0x 模式对 C++0x 特性的跟踪信息请参考 http://gcc.gnu.org/gcc-4.3/cxx0x_status.html 。可以使用选项 -std=c++0x 选择这个标准,为了获得标准要求的全部诊断信息,你还要使用选项 -pedantic( 或者使用 -pedantic-errors 以使 warning 变为 error) 。

默认的, GCC 对 C++ 语言提供了一些扩展;详情请参考 C++ 语言的扩展选项。使用上面提及的 -std 选项可以禁止这些扩展。使用选项 -std=gnu++98( 对应 C++98 的 GNU 扩展 ) 或 -std=gnu++0x( 对应 C++0x 的 GNU 扩展 ) ,你也可以显式的指定针对特定版本 C++ 的扩展。

 

2.3 Objective-C 语言和 Objective-C++ 语言

对于 Objective-C 语言和 Objective-C++ 语言,并没有正式的书面标准。最权威的手册是“ Object-Oriented Programming and the Objective-C Language ”,此手册的部分内容可以在以下网址获得。

http://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/ ,最近 ( 定期更新 ) 的版本;

http://www.toodarkpark.org/computers/objc/ ,一个比较老的例子

http://www.gnustep.org 和 http://gcc.gnu.org/readings.html ,有一些其他的有用的信息。

对于 Ada 编译器的兼容性和标准的遵从请参考 GNAT Reference Manual 。

GNU 对 Fortran 标准的支持请参考“标准”一节。

对于 gcj 和 Java 平台之间兼容性的详细信息,请参考“于 Java 平台的兼容性”一节。

原创粉丝点击