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
类型。如果编写新代码,任何人都可以阅读。