【问题标题】:Selectively remove a warning message using GCC使用 GCC 选择性地删除警告消息
【发布时间】:2010-10-29 20:07:01
【问题描述】:

这段代码:

Int32 status;
printf("status: %x", status)

给我以下警告:

jpegthread.c:157: warning: format '%x' expects type 'unsigned int', but argument 3 has type 'Int32'

我知道我可以通过强制转换类型来摆脱它,但是是否可以使用 GCC 编译器标志来摆脱那种特定类型的警告,并且仍然使用 -Wall

【问题讨论】:

  • 你实际上应该做的是包含<inttypes.h>,然后是printf("status : %" PRIx32, status),并首先转换为无符号整数。
  • 另外,如果可以的话,尝试使用<stdint.h> 中的标准intX_t 类型,如果编写新代码,任何人都在阅读。

标签: gcc warnings


【解决方案1】:

如果您需要该代码可移植,那么您应该将参数转换为 unsigned int,因为在某些平台上 int 类型的大小可能与 Int32 不同。

要回答有关在 GCC 中禁用特定警告的问题,您可以使用 -Wxxxx 在 GCC 中启用特定警告,并使用 -Wno-xxxx 禁用它们。

来自GCC Warning Options

您可以使用以-W 开头的选项来请求许多特定警告,例如-Wimplicit 以请求对隐式声明发出警告。这些特定的警告选项中的每一个都有一个以-Wno- 开头的否定形式来关闭警告;例如,-Wno-implicit。本手册仅列出了两种形式中的一种,以非默认形式为准。

对于您的情况,有问题的警告是 -Wformat

-Wformat

检查对 printf 和 scanf 等的调用,以确保提供的参数具有适合指定格式字符串的类型,并且格式字符串中指定的转换是有意义的。这包括 printf、scanf、strftime 和 strfmon(X/Open 扩展,不在 C 标准中)系列(或其他目标特定的家庭)。在没有指定格式属性的情况下检查哪些函数取决于所选的标准版本,并且-ffreestanding-fno-builtin 禁用了对未指定属性的函数的此类检查。

根据 GNU libc 2.2 版支持的格式功能检查格式。这些包括所有 ISO C90 和 C99 特性,以及来自单一 Unix 规范和一些 BSD 和 GNU 扩展的特性。其他库实现可能不支持所有这些功能; GCC 不支持对超出特定库限制的功能发出警告。但是,如果-pedantic-Wformat 一起使用,则会给出有关所选标准版本中没有的格式功能的警告(但不适用于strfmon 格式,因为它们不在任何C 标准版本中)。请参阅控制 C 方言的选项。

【讨论】:

  • 不回答这个问题:如何在不关闭 -Wall 的情况下禁用通常包含在 -Wall 中的特定警告?还是那不可能?
  • @AaronCampbell: -Wall -Wno-format 关闭-Wall 开启的格式警告。
  • +1 用于不讲授类型等,并实际展示如何使用 -Wno-xxxx 关闭某些警告。
【解决方案2】:

看起来 GCC 手册确实提供了一种使用#pragma 执行此操作的方法,实际上(与 Aiden Bell says 的内容相反):

6.62.13 Diagnostic Pragmas

例如,对于-Wuninitialized 警告,您可以这样做...

#pragma GCC diagnostic ignored "-Wuninitialized"

... 取消警告,或者...

#pragma GCC diagnostic warning "-Wuninitialized"

...即使您使用-Werror 构建,也将其视为警告(而不是错误)。

【讨论】:

  • 可能在撰写本文时没有。我正在查看 4.1.2 手册,其中不支持。
【解决方案3】:

我使用了以下 CFLAGS:

-Wall -Wformat=0

【讨论】:

  • 从来没有真正的需求,但我可以看到它很方便:)
  • 您能详细说明一下吗?语法是什么?它与configure或make一起使用吗?比如什么意思??命令和make之间有分号吗?这是很好的信息,但不能再含糊不清了。
【解决方案4】:

我猜你正在寻找

#ifdef WIN32
#pragma warning (disable: #num of the warning)
#endif

在 GCC 中等效...

您可以在 3.8 Options to Request or Suppress Warnings 中搜索类似 -Wno-conversion -Wno-format-security 的选项。

但就#pragma 指令而言:

引用来自 Google 的 GCC 邮件列表

GCC 目前不提供您正在寻找的#pragma 工具。

不要失去希望!有可行的 替代品。

修复代码的第一个最佳方法是 它不再发出警告。唉, 你已经说过你不能这样做。 :-(

注意:警告显示为 详细到您的团队可以容忍的程度! [见下文]

忽略 不需要的警告是后处理 GCC 的输出到脚本(例如 一个 Perl 脚本),它去掉了 您想要的具体、准确的警告 忽略。

忽略不受欢迎的下一个方法 警告是禁用警告 那个翻译单位。 -Wno-foozle-mcgoogle,只针对那个特定的翻译单元。那是一个 强大的大锤子,虽然。如果 警告在头文件中,它可能是 遍及你的整个 项目——我会指导你 后处理脚本解决方案 (假设你被禁止 修复代码)。

所以目前没有,没有#pragma 指令来禁用特定警告。除了使用 -Wall,您可以打开尽可能多的警告,减去特定的警告。

http://www.network-theory.co.uk/docs/gccintro/gccintro_31.html

或者修复代码

【讨论】:

  • 有趣的是,开发我的编译器的人比我更清楚我需要什么警告,而不需要什么警告。但是当在线论坛上的人也知道它时,它就会变成欢闹。
  • 或修复代码...除非警告是由 gcc bug 引起的并且没有开关可以禁用它:(
  • 第二个链接坏了:“嗯。我们找不到那个站点。我们无法连接到 www.network-theory.co.uk 的服务器。”
猜你喜欢
  • 2021-01-16
  • 2010-12-31
  • 2011-08-08
  • 2010-09-18
  • 1970-01-01
  • 2016-01-25
  • 1970-01-01
  • 2012-06-05
  • 2015-06-28
相关资源
最近更新 更多