我应该使用“-ansi”或显式“-std = …”作为编译器标志吗?

我已经读过 ANSI C与ISO C不完全相同,编译器可能在解释“-ansi”的含义上有所不同。 (gcc将其映射到C90,clang将其映射到C89)目前我倾向于使用“-std = …”而不是“-ansi”,因为它明确地显示了使用哪个标准。 由于我特别感兴趣的是在Linux,Windows和MAC上编译,我担心一些编译器无法理解“-std = …”而是“-ansi”。 那么使用一个在另一个上有任何利弊吗?

如果您希望编译器强制执行1989 ANSI C标准,或者等同于1990 ISO C标准(它们描述完全相同的语言),则可以安全地使用-ansi-std=c89

严格来说,名字-ansi不正确; 它指的是1989 ANSI C标准,但ANSI本身认为该标准已经过时; 它被1999年的ISO C标准(ANSI在发布后不久正式采用)取代,该标准本身已经或很快将被新的2011 ISO C标准所取代。 但是改变-ansi选项的含义会破坏太多的Makefile和构建脚本。

gcc 4.7及更高版本还将-std=c90识别为-std=c89的同义词。 gcc 4.7于2012年3月发布,所以-std=c90是合理的便携式,除非您需要允许旧版本的gcc。

-std=c99强制执行(大部分)1999 ISO C标准。 由于Microsoft特别不支持C99(即使在这些年后),使用此选项意味着编译器不会警告您使用其他地方可能不支持的C99特定function。 这里记录了 gcc的C99支持。

gcc 4.7 部分支持新的ISO C 2011标准, -std=c11 。 该支持在以后的版本中有所改进,但尚未完成。 这里记录了 gcc C11状态,据说与C99支持的级别相似。

有更多选项,以及我提到过的一些别名; 例如,在1999 ISO标准最终确定之前添加了选项-std=c9x ,它仍然受支持; 类似地, -std=c1x-std=c11的同义词。

我相信clang的目的是尽可能与gcc兼容,所以它应该支持具有相同含义的相同选项(除了一些较新的选项,取决于你使用的gcc和clang版本)。

gcc手册包含完整的详细信息,其中一节描述了支持的标准, 另一节指定了各种-ansi-std=...选项。 链接是4.7版本。 您还可以运行info gcc (如果您安装了GNU info命令和gcc文档),或者您可以在此处查看该手册的多个版本。

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

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

截至目前-ansi相当于gcc -std=c89 ,但这可能1)将来改变所以我建议你使用-std=c89 over -ansi 。 事实上,ISO c99也已获得ANSI的批准。

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

来自gcc 页面 :

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


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