我read ANSI C与ISO C不完全相同,编译器可能在解释“-ansi”的含义上有所不同。 (gcc将其映射到C90,clang将其映射到C89)目前我倾向于使用“-std = ...”而不是“-ansi”,因为它明确地显示了使用哪个标准。由于我特别感兴趣的是在Linux,Windows和MAC上编译,我担心一些编译器无法理解“-std = ...”而是“-ansi”。那么使用这个有什么优点和缺点吗?
答案 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在评论中指出的那样,尽管它可能不太可能,因为它会破坏许多构建脚本。
子>