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

时间:2018-07-20 00:47:08

标签: c gcc standards versioning c99

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 个答案:

答案 0 :(得分:2)

C版本是C标准的名称。

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

  • K&R
  • ANSI(对于ANSI,又称为C89,对于ISO为C90)
  • 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年出版。海湾合作委员会不支持   未经修正的版本。

     

1990年标准的修订版于1995年发布。   修正案在该语言中添加了二字和__STDC_VERSION__,但   否则涉及图书馆。该修正案俗称   AMD1;修订后的标准有时称为C94或C95。选择   在GCC中使用此标准,请使用选项-std=iso9899:199409(与   其他标准版本-pedantic来接收所有必需的   诊断程序。)

     

ISO C标准的新版本于1999年发布   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。)   完全支持此标准,并启用了-std=c11或   -std=iso9899:2011。集成了更正的版本称为C17,受-std=c17-std=iso9899:2017支持;的   更正也适用于-std=c11,唯一的区别是   选项之间的值为__STDC_VERSION__

     

默认情况下,GCC提供了一些C语言扩展,   在极少数情况下与C标准发生冲突。请参阅C的扩展   语言族。 C99标准的一部分功能包括   在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,但也有一些例外。海湾合作委员会要求独立   环境提供memcpy,memmove,memset和memcmp。最后,如果   使用__builtin_trap,并且目标未实现陷阱模式,则GCC发出中止调用。

     

有关技术勘误,基本原理文件和   可在线获取有关C历史的信息,请参阅   http://gcc.gnu.org/readings.html