12

读过ANSI C 与 ISO C 并不完全相同,编译器对“-ansi”的解释可能有所不同。(gcc 将其映射到 C90,clang 将其映射到 C89) 目前我倾向于使用“-std=...”而不是“-ansi”,因为它会明确显示使用的标准。由于我对在 Linux、Windows 和 MAC 上编译特别感兴趣,我担心有些编译器无法理解“-std=...”而是“-ansi”。那么使用其中一个有什么优点和缺点吗?

4

2 回答 2

20

如果您希望编译器强制执行 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 gccinfo

如果您要使用 gcc 以外的编译器(以及旨在与 gcc 兼容的编译器),则必须阅读他们的文档以了解如何执行各种版本的 C 标准。

于 2012-04-24T15:10:29.663 回答
4

-ansi-std=编译器标志可能由其他编译器共享,但它们是gcc标志。

截至目前-ansi相当于-std=c89ingcc但这可能1)将来会发生变化,所以我建议你使用-std=c89over -ansi。事实上,例如 ISO c99 也已被 ANSI 批准。

您应该注意到 c89 和 c90 本质上是相同的 C 标准。c89 是 ANSI 名称,而 c90 是 ISO 名称。

gcc 页面

这些出版物之间没有技术差异,尽管 ANSI 标准的部分被重新编号并成为 ISO 标准中的条款。从批准之日起,该标准的两种形式通常称为 C89,有时也称为 C90。


1) 正如 Keith Thompson 在评论中指出的那样,尽管它可能不太可能,因为它会破坏许多构建脚本。

于 2012-04-24T14:35:28.123 回答