这在gcc手册中有详细解释,可以通过输入
info gcc
或在线
here(如果已安装)获得。当前手册的相关部分在
here,但可能与您使用的版本相对应也可能不相对应。
自2013年发布此答案以来,其中一些信息已更改,并将继续更改。如果您在2023年左右阅读此内容,则当前版本可能是
-std=gnu17
(带有GNU特定扩展的C17;C17是对C11的轻微更新)。您应该检查所使用版本的文档。C23标准尚未发布,但应该很快就会发布。我无法预测gcc何时将切换到
-std=gnu23
作为其默认设置。如果您在遥远的未来阅读此内容,请告诉我们事情的进展情况。
gcc 3.0 到 4.9.4 版本默认使用 -std=gnu89
或 -std=gnu90
。
gcc 5.5 到 10.4 版本默认使用 -std=gnu11
(虽然跳过了 -std=gnu99
,但仍可指定)。
gcc 11.3 和 12.2 版本默认使用 std=gnu17
。
默认情况下,gcc不符合任何ANSI/ISO C标准。当前的默认设置等同于
-std=gnu17
,这是带有GNU特定扩展的2017年标准。(一些语言标准所要求的诊断未被发出。)早期版本的gcc默认为
-std=gnu90
或
-std=gnu11
。
如果您想要标准一致性,可以使用以下任何一个:
-std=c90 -pedantic
-std=c99 -pedantic
-std=c11 -pedantic
-std=c17 -pedantic
-std=c90
可以拼写为-ansi
、-std=c89
或-std=iso9899:1990
。
-std=iso9899:199409
支持C90标准加上1995年的修正案,增加了一些小的功能(这些功能也都在C99中)。
-std=c99
可以拼写为-std=c9x
或-std=iso9899:1999
(在标准发布之前使用了名称)。C99支持不完全,但接近于完整。
"
-std=c11
"也可以写成"
-std=c0x
"或"
-std=iso9899:2011
"(在最终标准发布之前使用了名称"
c0x
",错误地假定"
x
"不会超过9)。C11支持也不完整;当前状态
在此处概述。
"
-pedantic
"选项会导致gcc打印违反约束和语法规则所需的诊断信息。在某些情况下,这些诊断信息仅仅是警告--并且没有简单的方法来区分那些警告和其他不被语言要求的警告。将"
-pedantic
"替换为"
-pedantic-errors
",以使gcc将语言违规视为致命错误。
标准的简要历史:
- C89是第一个官方的C标准,由ANSI在1989年发布。
- C90是标准的ISO版本,描述了与C89完全相同的语言。ANSI正式采用了ISO的标准版本。有两个技术勘误,纠正了一些错误。
- C95是对C90的修正案,增加了一些功能,主要是双字符和宽字符支持。据我所知,合并版本从未发布过。
- C99是由ISO于1999年发布的。有三个技术勘误。
- C11是由ISO于2011年发布的。有一个技术勘误,修正了
__STDC_VERSION__
和__STDC_LIB_EXT1__
的定义。
- C17是由ISO于2017年发布的,只是对C11的轻微更新。
- C23将于2023年发布。(我写这篇文章时,它已接近完成,但文件仍在编辑中。)
ANSI没有发布自己的1999年或之后的标准版本,而是采用了ISO标准。
N1256是C99标准的免费草案,其中包括3个技术勘误合并在内。
N1570是C11标准的免费草案。它与已发布的C11标准有一些小的差异,还有一个技术勘误。更多详细信息,请参见这个问题的我的答案。