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,以便可以利用某些宏。
答案 0 :(得分:2)
C版本是C标准的名称。
按历史顺序排列的主要标准:
随着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