我应该使用“-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在评论中指出的那样,尽管它可能不太可能,因为它会破坏许多构建脚本。