【问题标题】:language standard version versus compiler version语言标准版本与编译器版本
【发布时间】:2018-07-20 00:47:08
【问题描述】:

C 版本(例如C99)和C 编译器版本(例如4.9.3)有什么区别

$ ./arm-none-eabi-gcc --version
arm-none-eabi-gcc (GNU Tools for ARM Embedded Processors) 4.9.3 20150529 (release) [ARM/embedded-4_9-branch revision 227977 with DYNAMIC_REENT by Ambarella]
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

我如何判断我是否至少使用 C99,以便我可以利用某些宏。

【问题讨论】:

标签: c gcc standards versioning c99


【解决方案1】:

C 版本是 C 标准的名称。

按历史顺序排列的主要标准:

  • K&R
  • ANSI(又名 C89 用于 ANSI,C90 用于 ISO)
  • C99
  • C11

随着 C 语言在过去 40 年中的发展,这些标准中引入了新的或修改的特性。

gcc 编译器版本 - 只是软件的版本。旧版本可能不支持新的 C 标准。您可以使用命令行选项告知编译器您的代码符合什么标准:

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

【讨论】:

    猜你喜欢
    • 2014-05-13
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 2014-08-22
    • 2015-06-11
    相关资源
    最近更新 更多