【问题标题】:GCC options to enforce Ansi C standard check?强制执行 Ansi C 标准检查的 GCC 选项?
【发布时间】:2010-12-21 18:32:43
【问题描述】:

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

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

【问题讨论】:

  • ANSI 于 1989 年发布了最初的 C 标准。ISO 于 1990 年发布了相同标准的版本,ANSI 正式采用了该版本。 ISO 在 1999 年和 2011 年发布了该标准的新版本,而 ANSI 已经采用了它们中的每一个,使早期版本正式过时。令人困惑的是,术语“ANSI C”仍然通常(并且错误地)用来指代 1989/1990 版本定义的语言,而gcc -ansi 仍然指的是那个版本。我建议术语“ANSI C”是模棱两可的,应该避免。请参阅 C89/C90、C99 或 C11。

标签: c gcc c99


【解决方案1】:

-ansi 标志与-std=c89 标志同义。

只需将-std=c99-pedantic 一起使用就足够了。

如有疑问,您可以随时refer to the GCC documentation。从 GCC 3.4.2 开始,要阅读的章节是 2 - Language Standards Supported by GCC

【讨论】:

  • ...-std=c99-pedantic...:我不明白这和-std=c89 之间的区别,你的意思是那些-ansi 错误会显示为警告吗?
【解决方案2】:

这是一个老问题,但我只是想补充一点。

首先,无论您提供给 GCC 的通用命令行开关集如何,目前似乎都不可能让 GCC 将所有约束违规报告为“错误”和所有内容否则作为“警告”。从 C 语言的角度来看,GCC 报告为“警告”的一些诊断消息实际上是违反约束(即“错误”),但没有办法强制 GCC 承认这一事实并生成“错误”诊断。很可能通过微调各个警告类型可以实现更精确的分离,但我不确定 GCC 设置是否提供足够的粒度来实现良好的匹配。

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

附:语言规范不要求/定义将诊断消息分离为“错误”和“警告”,但实际上许多程序员希望将违反约束的情况报告为“错误”。当您在问题中提到“执行警告/错误”时,我认为您可能是这样的意思。

【讨论】:

  • 很好的观察结果。无论如何,我相信由于 C 允许这么多危险的事情,唯一理智的工作方式是将 any 警告作为错误处理(即,直到它使用 -Werror 构建时才完成) .那么有些错误是否被误报为警告也没关系。
【解决方案3】:
-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 才能满足您的需求。

【讨论】:

  • “ANSI C 与 C99 不同”。 ANSI 已采用 C99 作为标准。只是不知出于什么原因,C89 被称为“ANSI C”,以区别于标准前的 C,并且这个名称一直存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-11
  • 2011-04-16
  • 1970-01-01
  • 2015-06-15
  • 2010-09-27
  • 2011-11-14
相关资源
最近更新 更多