选择性地删除警告消息GCC

sho*_*nex 37 gcc warnings

这段代码:

Int32 status;
printf("status : %x", status)
Run Code Online (Sandbox Code Playgroud)

给我以下警告:

jpegthread.c:157: warning: format '%x' expects type 'unsigned int', but argument 3 has type 'Int32'
Run Code Online (Sandbox Code Playgroud)

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

lot*_*har 78

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

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

GCC警告选项:

您可以通过选项开始请求许多特定警告-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 中通常包含的特定警告?或者这是不可能的? (4认同)
  • @AaronCampbell:`-Wall -Wno-format`关闭`-Wall`打开的格式警告. (3认同)
  • +1不讲授类型等,并实际展示如何使用-Wno-xxxx关闭某些警告。 (3认同)

dho*_*ert 30

看起来GCC手册确实提供了一种方法来实现#pragma.(与Aiden Bell在另一个答案中所说的相反)

http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html

例如,对于-Wuninitialized警告,你可以......

#pragma GCC diagnostic ignored "-Wuninitialized"
Run Code Online (Sandbox Code Playgroud)

......压制警告,或......

#pragma GCC diagnostic warning "-Wuninitialized"
Run Code Online (Sandbox Code Playgroud)

...即使您正在使用-Werror进行构建,也将其视为警告(而非错误).

  • 可能在撰写本文时没有.我正在查看4.1.2手册,但不支持它. (4认同)

sho*_*nex 10

我使用了以下CFLAGS:

-Wall -Wformat=0
Run Code Online (Sandbox Code Playgroud)

  • 你能详细说明吗?语法是什么?它是用于configure还是make?喜欢什么意思?命令和make之间是否有半冒号?这是很好的信息,但它不能再模糊了. (3认同)

Aid*_*ell 5

我猜你正在寻找

#ifdef WIN32
#pragma warning (disable: #num of the warning)
#endif
Run Code Online (Sandbox Code Playgroud)

相当于 GCC...

您可以在3.8 请求或抑制警告的选项中搜索-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

或者修复代码

  • 有趣的是,开发我的编译器的人比我更清楚我需要什么警告,不需要什么警告。但当在线论坛上的人们也知道这一点时,它就变成了搞笑。 (4认同)
  • 根据 GCC 手册,不正确:http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html (2认同)
  • 或修复代码...除非警告是由 [gcc bug](https://gcc.gnu.org/bugzilla//show_bug.cgi?id=61414) 引起的,并且没有开关可以禁用它:( (2认同)