代码之家  ›  专栏  ›  技术社区  ›  tarabyte

语言标准版本与编译器版本

  •  1
  • tarabyte  · 技术社区  · 6 年前

    两者之间有什么区别 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,以便可以利用某些宏。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Jonathan Leffler vy32    6 年前

    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标准中的条款美国国家标准协会 标准,但不是ISO标准,也有一个基本原理 文件这两种形式的标准通常称为C89, 或偶尔作为C90,从批准之日起。选择这个 GCC中的标准,使用其中一个选项 -ansi , -std=c90 -std=iso9899:1990 ;要获得标准要求的所有诊断,还应指定 -pedantic (或 -pedantic-errors 如果 你希望它们是错误而不是警告。参见选项 控制C方言。

    1990年ISO C标准中的错误在两项技术上得到了修正 1994年和1996年出版的勘误表GCC不支持 未修正版本。

    1995年公布了对1990年标准的修正案。这 修正增加了有向图和 __STDC_VERSION__ 对语言来说,但是 与图书馆有关。这个修正案通常被称为 修改后的标准有时称为C94或C95。选择 在GCC中,使用选项 -std=iso9899:199409 (关于 其他标准版本, -迂腐的 接收所有必需的 诊断)。

    iso c标准的新版本于1999年作为iso/iec标准出版。 9899:1999,俗称C99(在开发过程中,草稿 这个标准版本被称为C9X) 基本上完全支持此标准版本;请参见 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。)GCC基本上 完全支持此标准,启用 -std=c11 -std=iso9899:2011 是的。集成了更正的版本称为C17,并支持 -std=c17 -std=iso9899:2017 ;的 修正也适用于 -标准=C11 ,唯一的区别是 选项之间的值是 __STDC_版本__ .

    默认情况下,GCC为C语言提供了一些扩展,在 很少与C标准冲突参见C的扩展 语言家族。C99标准的一些特性是 在c90模式下被接受为扩展,一些特性是 c11标准在c90和c99模式下被接受为扩展。使用 的 -std 上面列出的选项禁用这些扩展 与选定的C标准版本冲突。您也可以选择 C语言的扩展版本显式地 -std=gnu90 (用于C90 有GNU扩展) -std=gnu99 (对于带GNU扩展的C99)或 -std=gnu11 (用于带GNU扩展的C11)。

    如果没有给出C语言方言选项,则默认为 -标准=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 *[]) 是的。一个 操作系统内核是在独立的 环境;使用操作系统设施的程序是 在托管环境中运行程序的示例。

    GCC的目标是作为一个一致的独立的 实现,或作为一致宿主的编译器 实施。默认情况下,它充当托管 实施,定义 __STDC_HOSTED__ 假设当 使用iso c函数的名称,它们定义了语义 在标准中使它成为一个一致的独立的 对于独立环境的实现,请使用 -ffreestanding ;然后定义 _主办的STDC__ 为0,不假设标准中函数名的含义 图书馆,但下列情况除外要构建操作系统内核,您可以 好吧,还是需要自己安排链接和启动。 请参见控制C方言的选项。

    GCC不提供仅托管的 实现,也不是C99所需的所有功能 所有平台上的独立实现使用设施 对于托管环境,您需要在其他地方找到它们(例如, 在GNU C库中)请参见标准库。

    gcc使用的大多数编译器支持例程都存在于 但也有一些例外。GCC要求独立 环境提供memcpy、memmove、memset和memcmp最后,如果 __builtin_trap 使用,并且目标不实现陷阱模式,则gcc发出中止调用。

    技术勘误、基本原理文件和 有关联机可用的C历史记录的信息,请参见 http://gcc.gnu.org/readings.html