选择性地删除警告消息GCC

时间:2009-05-29 09:34:02

标签: gcc warnings

这段代码:

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

给了我以下警告:

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

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

4 个答案:

答案 0 :(得分:72)

如果您需要该代码可以移植,那么您应该将参数转换为 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方言。

答案 1 :(得分:27)

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

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

e.g。对于-Wuninitialized警告,你可以做...

#pragma GCC diagnostic ignored "-Wuninitialized"

...禁止警告,或......

#pragma GCC diagnostic warning "-Wuninitialized"

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

答案 2 :(得分:9)

我使用了以下CFLAGS:

-Wall -Wformat=0

答案 3 :(得分:2)

我认为你正在寻找

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

相当于海湾合作委员会......

您可以搜索在这里完成工作的 -Wno-conversion -Wno-format-security 等选项

http://gcc.gnu.org/onlinedocs/gcc-4.0.0/gcc/Warning-Options.html

但就#pragma指令而言:

我引自Google的 GCC邮件列表

  

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

     

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

     

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

     

注意:警告已显示为   你的团队可以忍受的冗长!   [见下文]

     

忽略下一个最好的方法   不希望的警告是后期处理   GCC输出到脚本(例如   一个剥离出来的Perl脚本   您想要的具体,准确的警告   忽略。

     

忽略不受欢迎的下一种方法   警告是禁用警告   那个翻译单位。   -Wno-foozle-mcgoogle,仅适用于该特定翻译单元。那是一个   但是,强大的锤子。如果是的话   警告是在头文件中,它可能是   贯穿你的整个过程   项目 - 我指导你   后处理脚本解决方案   (假设你不被允许   修复代码。)

目前还没有,没有#pragma指令来禁用特定警告。而不是使用-Wall你可以打开尽可能多的警告,减去特定的警告。

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

或修复代码