这段代码:
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方言.
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进行构建,也将其视为警告(而非错误).
sho*_*nex 10
我使用了以下CFLAGS:
-Wall -Wformat=0
Run Code Online (Sandbox Code Playgroud)
我猜你正在寻找
#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
或者修复代码