我读过ANSI C 与 ISO C 并不完全相同,编译器对“-ansi”的解释可能有所不同。(gcc 将其映射到 C90,clang 将其映射到 C89) 目前我倾向于使用“-std=...”而不是“-ansi”,因为它会明确显示使用的标准。由于我对在 Linux、Windows 和 MAC 上编译特别感兴趣,我担心有些编译器无法理解“-std=...”而是“-ansi”。那么使用其中一个有什么优点和缺点吗?
2 回答
如果您希望编译器强制执行 1989 ANSI C 标准,或等效的 1990 ISO C 标准(它们描述完全相同的语言),您可以安全地使用-ansi
或-std=c89
.
-ansi
严格来说,这个名字是不正确的;它指的是 1989 年的 ANSI C 标准,但 ANSI 本身认为该标准已过时;它被 1999 年 ISO C 标准(ANSI 发布后不久正式采用)取代,该标准本身已经或很快将被新的 2011 年 ISO C 标准取代。但是更改-ansi
选项的含义会破坏太多Makefile
的s并构建脚本。
gcc 4.7 及更高版本也-std=c90
将-std=c89
. gcc 4.7 于 2012 年 3 月发布,因此-std=c90
具有合理的可移植性,除非您需要允许旧版本的 gcc。
-std=c99
执行(大部分)1999 ISO C 标准。由于 Microsoft 尤其不支持 C99(即使经过这么多年),使用此选项意味着编译器不会警告您使用其他地方可能不支持的 C99 特定功能。gcc 的 C99 支持在此处记录。
gcc 4.7部分支持新的 ISO C 2011 标准,带有-std=c11
. 该支持在以后的版本中得到了改进,但尚未完成。gcc C11 状态在此处记录,据说与 C99 支持的级别相似。
还有更多选项,以及我提到的一些别名;例如,该选项-std=c9x
是在 1999 年 ISO 标准最终确定之前添加的,并且仍然受支持;同样,-std=c1x
是 的同义词-std=c11
。
我相信 clang 旨在尽可能地与 gcc 兼容,因此它应该支持具有相同含义的相同选项(可能除了一些较新的选项,具体取决于您使用的 gcc 和 clang 版本)。
gcc 手册包含完整的详细信息,其中一节描述了支持的标准,另一节指定了各种选项。链接指向 4.7 版本。您也可以运行(如果您安装了 GNU命令和 gcc 文档),或者您可以在此处查看手册的多个版本。-ansi
-std=...
info gcc
info
如果您要使用 gcc 以外的编译器(以及旨在与 gcc 兼容的编译器),则必须阅读他们的文档以了解如何执行各种版本的 C 标准。
-ansi
和-std=
编译器标志可能由其他编译器共享,但它们是gcc
标志。
截至目前-ansi
相当于-std=c89
ingcc
但这可能1)将来会发生变化,所以我建议你使用-std=c89
over -ansi
。事实上,例如 ISO c99 也已被 ANSI 批准。
您应该注意到 c89 和 c90 本质上是相同的 C 标准。c89 是 ANSI 名称,而 c90 是 ISO 名称。
从gcc
页面:
这些出版物之间没有技术差异,尽管 ANSI 标准的部分被重新编号并成为 ISO 标准中的条款。从批准之日起,该标准的两种形式通常称为 C89,有时也称为 C90。
1) 正如 Keith Thompson 在评论中指出的那样,尽管它可能不太可能,因为它会破坏许多构建脚本。