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

时间:2012-04-24 14:32:45

标签: c c89 compiler-flags ansi-c

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

2 个答案:

答案 0 :(得分:19)

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

严格来说,名称-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月发布,因此除非您需要允许旧版本的gcc,否则-std=c90可以合理移植。

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

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

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

我认为clang旨在尽可能与gcc兼容,所以它应该支持具有相同含义的相同选项(除了一些较新的选项,取决于gcc的哪个版本和clang你&#39 ;重新使用)。

gcc手册包含完整的详细信息,one section描述了支持的标准,another指定了各种-ansi-std=...选项。链接是4.7版本。您还可以运行info gcc(如果您安装了GNU info命令并安装了gcc文档),或者您可以看到手册here的多个版本。

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

答案 1 :(得分:4)

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

截至目前-ansi相当于-std=c89中的gcc,但未来可能会 1)更改,因此建议您使用{{1}超过-std=c89。事实上,ISO c99也已被ANSI批准。

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

来自-ansi page

  

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

<小时/> <子>

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