Gcc 有选择地删除警告消息
这段代码:Gcc 有选择地删除警告消息,gcc,warnings,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?我想您正在寻找 #ifdef WIN32 #pragma warn
Int32 status;
printf("status : %x", status)
给我以下警告:
jpegthread.c:157: warning: format '%x' expects type 'unsigned int', but argument 3 has type 'Int32'
我知道我可以通过强制转换类型来消除它,但是使用GCC编译器标志是否可以消除特定类型的警告,并且仍然使用
-Wall
?我想您正在寻找
#ifdef WIN32
#pragma warning (disable: #num of the warning)
#endif
GCC中的等效项
您可以在此处搜索执行此任务的选项,例如-Wno conversion-Wno format security
但就#pragma指令而言:
我引用了谷歌的GCC邮件列表:
GCC目前没有提供您正在寻找的#pragma设施
不要失去希望!有可行的方法
替代品
修复代码的第一个最佳方法是
它不再发出警告。唉,,
您已声明不能这样做:-(
注意:是否将警告显示为
你的团队可以容忍的冗长!
[见下文]
下一个最好的方法是忽略
不希望出现的警告是后处理
将GCC输出到脚本(例如
一个Perl脚本),它去掉了
您想要的具体、准确的警告
忽略
下一个忽略不想要的东西的方法
“警告”用于禁用对的警告
那个翻译单位。
-Wno foozle mcgoogle,只针对那个特殊的翻译单元。这是一个
但这是一把巨大的锤子,如果
警告位于头文件中,可能是
遍及你的整个生活
我会告诉你的
后处理脚本解决方案
(假设你被禁止
正在修复代码)
因此,目前还没有禁用特定警告的#pragma指令。您可以启用尽可能多的警告,而不是使用-Wall
或修复代码我使用了以下cflag:
-Wall -Wformat=0
如果需要该代码可移植,则应将参数强制转换为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方言的选项
实际上,GCC手册似乎确实提供了一种使用#pragma实现这一点的方法(与Aiden Bell在另一个答案中所说的相反) e、 对于-Wuninitialized警告,您可以
#pragma GCC diagnostic ignored "-Wuninitialized"
…以抑制警告,或
#pragma GCC diagnostic warning "-Wuninitialized"
…将其视为警告(而不是错误),即使您正在使用-Werror进行构建。从来没有真正的要求,但我可以看到它非常方便:)你能详细说明一下吗?语法是什么?它是与configure或make一起使用的吗?比如你是什么意思?命令和make之间有分号吗?这是很好的信息,但不能再含糊不清了。根据GCC手册,这是不正确的:有趣的是,开发我的编译器的人比我更清楚我需要什么警告,而不是什么警告。但当在线论坛上的人也知道它时,它就会变成欢闹。或者修复代码…除非警告是由a引起的,并且没有禁用它的开关:(可能在编写时没有。我正在看4.1.2手册,但它不受支持。没有回答以下问题:如何在不关闭-Wall的情况下禁用-Wall中通常包含的特定警告?或者这是不可能的?@AaronCampbell:
-Wall-Wno format
关闭-Wall
。您实际应该做的可能是包括
,然后是printf(“状态:%”PRIx32,status)
,并首先转换为无符号整数。如果可以,请尝试使用
中的标准intX\u t
类型。如果编写新代码,任何人都可以阅读。