mat*_*ath 12 c compiler-flags c89 ansi-c
我已经读过 ANSI C与ISO C不完全相同,编译器可能对"-ansi"的解释有所不同.(gcc将其映射到C90,clang将其映射到C89)目前我倾向于使用"-std = ..."而不是"-ansi",因为它明确地显示了使用哪个标准.由于我特别感兴趣的是在Linux,Windows和MAC上编译,我担心一些编译器无法理解"-std = ..."而是"-ansi".那么使用一个在另一个上有任何利弊吗?
Kei*_*son 19
如果您希望编译器强制执行1989 ANSI C标准,或者等同于1990 ISO C标准(它们描述完全相同的语言),您可以安全地使用-ansi或者-std=c89.
-ansi严格来说,这个名字是不正确的; 它指的是1989 ANSI C标准,但ANSI本身认为该标准已经过时; 它被1999年的ISO C标准(ANSI在发布后不久正式采用)取代,该标准本身已经或很快将被新的2011 ISO C标准所取代.但是改变-ansi选项的含义会破坏太多Makefiles并构建脚本.
gcc 4.7及更高版本也被-std=c90认为是同义词-std=c89.gcc 4.7于2012年3月发布,因此-std=c90除非您需要允许旧版本的gcc,否则它是合理的便携式.
-std=c99执行(大部分)1999 ISO C标准.由于微软特别不支持C99(即使经过这么多年),使用此选项意味着编译器不会警告你使用的C99的特殊功能,可能无法在其他地方支持.这里记录了 gcc的C99支持.
gcc 4.7 部分支持新的ISO C 2011标准-std=c11.该支持在以后的版本中有所改进,但尚未完成.这里记录了 gcc C11状态,据说与C99支持的级别相似.
有更多选项,以及我提到过的一些别名; 例如,在-std=c9x1999 ISO标准最终确定之前添加了该选项,并且它仍然受到支持; 同样,-std=c1x是一个同义词-std=c11.
我相信clang旨在尽可能与gcc兼容,所以它应该支持具有相同含义的相同选项(除了一些较新的选项,取决于你使用的gcc和clang的版本).
gcc手册包含完整的详细信息,一个部分描述了支持的标准,另一个部分指定了各种-ansi和-std=...选项.链接是4.7版本.您也可以运行info gcc(如果您安装了GNU info命令和gcc文档),或者您可以在此处查看该手册的多个版本.
如果您打算使用除gcc之外的编译器(以及旨在兼容gcc的编译器),您必须阅读他们的文档以了解如何强制执行各种版本的C标准.