【问题标题】:How can I make this GCC warning an error?如何使此 GCC 警告成为错误?
【发布时间】:2009-01-24 03:10:41
【问题描述】:

我收到来自 GCC 的警告:

警告:不能通过 '...' 传递非 POD 类型 'class Something' 的对象;调用将在运行时中止

这是非常致命的,尤其是因为它调用了中止。为什么这不是错误?我想让它成为一个错误,但是:

  1. 如何将特定警告设为错误?
  2. 是哪个警告?根据3.8 Options to Request or Suppress Warnings-Wno-invalid-offsetof 的说法,看起来像是隐藏它的标志,但事实并非如此。

【问题讨论】:

  • 幸运的是,现代版本的 GCC(至少 4.6.3,但可能更早)让您知道哪个警告标志触发了特定警告。例如:main.cpp:12:15: error: division by zero [-Werror=div-by-zero]
  • 这真是一个很棒的功能。

标签: gcc gcc-warning


【解决方案1】:

我不确定正确的警告是什么,但是一旦你找到它,你可以通过以下方式改变它的处理方式(以“格式”为例):

#pragma GCC diagnostic error "-Wformat"

或者strager points out:

gcc -Werror=format ...

我已经为此检查了 gcc 源,并且无法通过命令行标志禁用此特定警告。

【讨论】:

    【解决方案2】:

    -Werror=specific-warning 会将指定的-Wspecific-warning 转换为 GCC 4.3.x 或更高版本中的错误。在 4.1.2 中,只有 -Werror-implicit-function-declaration 有效。请注意连字符而不是等号——它仅适用于特定情况,不适用于其他情况。这是较严重的常见警告之一,将其变为错误绝对很方便。

    除此之外,旧版本的 GCC 似乎只提供了 -Werror 使每一个警告都成为错误的大锤。

    【讨论】:

      【解决方案3】:

      听起来还有一堆您不想变成错误的其他警告(使用 -Werror 标志)。一般来说,修复所有警告是一种很好的做法。使用 -Werror 会强制执行此操作。

      【讨论】:

      • 阿门,您的代码至少应该没有警告 -Wall(尽管 -Wextra 报告的一些内容是可以原谅的,例如未使用的变量/参数)。
      • 你可以做 -Wall -Wextra -Wno-unused-parameters -Wno-unused-functions ... 任何特定的警告都可以用 -Wno-$foo 语法来禁用,这样很容易原谅细节。不幸的是,它对 -pedantic 警告的任何子集都没有帮助。
      • 警告不是要“修复”的错误。除非您修复编译器版本,否则无警告代码是一个难以捉摸的概念。另请参阅Tidbits: For the love of god, don't use -Werror!
      【解决方案4】:

      您可以使用 -Werror 编译器标志将所有或部分警告转换为错误。

      【讨论】:

        【解决方案5】:

        您可以使用-fdiagnostics-show-option 查看适用于特定警告的 -W 选项。

        很遗憾,在这种情况下,没有任何特定选项可以涵盖该警告。

        看来 GCC 4.5 会对此提供更好的支持。

        【讨论】:

          猜你喜欢
          • 2022-10-31
          • 2023-04-04
          • 2021-12-23
          • 2023-03-29
          • 1970-01-01
          • 1970-01-01
          • 2013-12-09
          • 2020-09-26
          • 2023-03-03
          相关资源
          最近更新 更多