这段代码:
Int32 status;
printf("status : %x", status)
给了我以下警告:
jpegthread.c:157: warning: format '%x' expects type 'unsigned int', but argument 3 has type 'Int32'
我知道我可以通过转换类型来摆脱它,但是可以使用GCC编译器标志来摆脱特定类型的警告,并仍然使用-Wall
吗?
答案 0 :(得分:72)
如果您需要该代码可以移植,那么您应该将参数转换为 unsigned int ,因为在某些平台上,int类型的大小可能与Int32不同。
要回答有关在gcc中禁用特定警告的问题,您可以使用 -Wxxxx 在gcc中启用特定警告,并使用 -Wno-xxxx 禁用它们。
您可以使用以
-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
或修复代码