GCC选项以执行Ansi C标准检查?

17

我应该使用什么gcc选项来强制执行ANSI C(C99)警告/错误? gcc(GCC)3.4.2(mingw-special)

我正在使用: gcc -pedantic -ansi -std=c99 这样做正确吗?


1
ANSI于1989年发布了最初的C标准。ISO在1990年发布了同样的标准,并且ANSI正式采用了该版本。ISO在1999年和2011年分别发布了新版标准,而ANSI已经采用了它们中的每一个,使早期版本正式过时。令人困惑的是,“ANSI C”这个术语仍然常被(错误地)用来指代由1989/1990版定义的语言,而gcc -ansi仍然指的是那个版本。我建议避免使用“ANSI C”这个模糊不清的术语。改用C89/C90、C99或C11。 - Keith Thompson
3个回答

33
< p > -ansi 标志与 -std=c89 标志同义。

只使用带有 -pedantic -std=c99 应该就足够了。

如果有疑问,您总是可以 参考GCC文档。截至GCC 3.4.2,要阅读的章节是2- GCC支持的语言标准


...使用-std=c99-pedantic参数:我不明白这与-std=c89的区别,你是说那些-ansi错误会显示为警告吗? - VimNing

8

这是一个老问题,但我想要补充一些额外的观点。

首先,无论你为GCC提供哪组通用命令行开关,目前似乎不可能使GCC将所有约束违规报告为“错误”,而将其他所有内容报告为“警告”。 GCC报告为“警告”的一些诊断消息实际上是从C语言的角度来看的约束违规(即“错误”),但没有办法强制GCC认识到这一事实并生成“错误”诊断。也许可以通过微调单个警告类型来实现更精确的分离,但我不确定GCC设置是否提供足够的细粒度来实现良好的匹配。

其次,GCC提供了-pedantic-errors选项,可用于替换普通的-pedantic,旨在实现对诊断消息的更精确分类(如上所述)为“错误”和“警告”。然而,它仍然不完美。

P.S. 语言规范不要求/定义将诊断消息分为“错误”和“警告”,但在实践中,许多程序员希望将约束违规报告为“错误”。当您在问题中提到“强制执行警告/错误”时,我认为您可能指的是这样的内容。


1
好的观察。无论如何,我认为由于C语言允许许多危险的事情,唯一明智的工作方式是将任何警告视为错误(即,在使用“-Werror”构建之前,你还没有完成)。然后,即使某些错误被错误地报告为警告,也不会有影响。 - sleske

4
-ansi
    In C mode, this is equivalent to -std=c89. In C++ mode, it is equivalent to -std=c++98.

ANSI C与C99不同(目前)。此外,-Wall也可能会引起兴趣,但只有-pedantic才能做到你想要的。


6
"ANSI C并非与C99相同"。 ANSI已将C99采用为标准。只是由于某些原因,C89被称为“ANSI C”,以区别于标准之前的C版本,并且这个名称一直沿用至今。 - Steve Jessop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接