C 禁用默认警告的警告/错误

C 禁用默认警告的警告/错误,c,gcc,suppress-warnings,C,Gcc,Suppress Warnings,我们想开始在大型项目上使用-Wall-Werror。 由于规模的原因,此更改必须分阶段进行,我们希望首先从最重要的警告开始 最好的方法似乎是使用-Wall-Werror,特定警告除外。特别的警告是那些我们有很多(因此修复它们都是困难和危险的),并且我们不认为它们非常危险。 我并不是说我们不想修复所有这些警告——只是不想在第一阶段修复 我知道从-Werror中排除警告的两种方法-最好的方法是-Wno error=xxx,如果它不起作用--Wno xxx(当然,我们更喜欢看到警告并忽略它,而不是隐藏

我们想开始在大型项目上使用
-Wall-Werror

由于规模的原因,此更改必须分阶段进行,我们希望首先从最重要的警告开始

最好的方法似乎是使用
-Wall-Werror
,特定警告除外。特别的警告是那些我们有很多(因此修复它们都是困难和危险的),并且我们不认为它们非常危险。 我并不是说我们不想修复所有这些警告——只是不想在第一阶段修复

我知道从
-Werror
中排除警告的两种方法-最好的方法是
-Wno error=xxx
,如果它不起作用-
-Wno xxx
(当然,我们更喜欢看到警告并忽略它,而不是隐藏它)

我的问题是默认情况下启用的警告,并且没有与其相关的
-Wxxx
标志。当使用
-Werror
时,我找不到任何方法来全部下载它们

我特别关注两个具体的警告。下面是一个展示它们和编译器输出的程序:

#include <stdio.h>
void f(int *p) { printf("%p\n", p); }

int main(int argc, char *argv[]) {
        const int *p = NULL;
        const unsigned int *q = NULL;
        f(p);           /* Line 7: p is const, f expects non const */
        if (p == q) {   /* Line 8: p is signed, q is unsigned */
                printf("Both NULL\n");
        }
        return 0;
}

% gcc warn.c
warn.c: In function 'main':
warn.c:7: warning: passing argument 1 of 'f' discards qualifiers from pointer target type
warn.c:8: warning: comparison of distinct pointer types lacks a cast
#包括
void f(int*p){printf(“%p\n”,p);}
int main(int argc,char*argv[]){
常数int*p=NULL;
常量unsigned int*q=NULL;
第7行:p是常数,f期望非常数*/
如果(p==q){/*第8行:p是有符号的,q是无符号的*/
printf(“均为空\n”);
}
返回0;
}
%gcc.c
warn.c:在函数“main”中:
warn.c:7:警告:传递'f'的参数1将丢弃指针目标类型中的限定符
warn.c:8:warning:不同指针类型的比较缺少强制转换
我知道最好的解决办法是修复这些警告,但说起来容易做起来难。为了使这项变革取得成功,我们必须分阶段进行,不能一次做太多的变革

有什么建议吗?
谢谢。

以编译单元/模块/库为基础而不是按警告分阶段进行如何?触发子目标编译是否是一种选择(一个足够好的构建系统)?

这可能是愚蠢的,但是

为什么不简单的grep呢

差不多

 gcc teste.c 2>&1 | grep -v 'comparison of distinct' | grep -v 'some_other_string'

您可能希望在脚本中隐藏这些grep,并从makefile而不是gcc调用脚本,因为它将是“-wdiscared限定符”,但是由于bug fixed条目是从2014年5月1日开始的,因此您使用的gcc编译器可能不支持它

换一种方式做怎么样,即在全球范围内启用
-Wall
,并且只在您“清理”的部分代码上启用
-Werror
?@H2CO3他说他将修复它,但在一个大型项目中,我可以看出他不想首先处理这个问题。不必像对待孩子一样对待他,也不必对他隐瞒任何东西。@H2CO3,Const correction是一件伟大的事情,但在一个大项目中很难做到,如果在多年的发展中被忽视的话。为了修复一个简单的警告,您最终更改了数十个函数,这在目前是不可能的。@ugoren:不太可能。只要你把
-Wall
放得到处都是,并且记录你的构建输出,一个简单的
grep
就会告诉你所有你还没有修复的警告。@H2CO3,从const corrective开始,并在运行中保持它是很好的。但我说的是一个巨大的项目,它被忽视了很长时间。你不可能在一天内修复它。按模块分阶段没有多大帮助。我们需要很长时间才能通过这种方式在代码中启用重要警告。我不确定触发子目标编译是什么意思。没错,这需要很长时间,但由于您在帖子中提出的问题是不可能的(禁用由-Wall启用的内置警告),问题在于如何以合理的方式过滤输出。如果您在模块基础上工作,那么您可以一次处理所有警告,因为它们是更小的代码库所固有的。另一个建议是:使用wc-l至少运行一次完整的警告计数,以确保您没有添加被过滤掉的新警告。对于一个简单的编译来说,这一切都很好。但是对于一个复杂的项目,很多开发人员、平台、编译方法,这种方法变得相当困难。@ugoren“很多编译方法”??如果不是每个人都在使用同一个构建系统,那么你可能会有更大的问题要处理。@MattMcNabb,我们有更大的问题,但要在这里发布这些问题太复杂了。这并不意味着我们不应该解决小问题。