如何防止GCC中的警告隐藏错误

nkcskrwz  于 2022-11-12  发布在  其他
关注(0)|答案(2)|浏览(168)

我最近接手了一个很大很老的项目,它编译起来没有问题,但是因为代码太老了,以前的开发人员并不总是按照他们应该做的方式来做事情,所以我在使用现代编译器时收到了很多警告。
现在我修改了部分代码,有时会引入错误。当我重新编译项目时,会出现很多警告输出,在输出的末尾,我看到这样的消息:

SomeFile.C:3426:51: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
         SomeCode("Some String");
                               ^
SomeFile.C:3429:55: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
         SomeCode("Some Other String");
                                     ^
make[2]: *** [SomeFile.o] Error 1
make[2]: Leaving directory `/some/path/of/a/source/directory/somesubdirectory'
make[1]: *** [somesubdirectory] Error 2
make[1]: Leaving directory `/some/path/of/a/source/directory'
make: *** [directory] Error 2

BUILD FAILED (exit value 2, total time: 2s)

还有上面的很多警告(我只是展示了几十个列表中的两个)。
真实的的错误显示在上面数百行,内容如下:

SomeFile.C: In function 'void someFunction()':
SomeFile.C:891:5: error: 'someIdentifier' was not declared in this scope
     someIdentifier->someMoreStuff->someMethod(someArgs);
     ^

我现在的问题是找到错误信息。如果我能关闭警告就很容易了,因为这样错误信息就会是最后打印的东西。

那么,有没有办法告诉编译器不要给予任何警告,或者至少在最后打印错误消息(这就足以解决我的问题了)?

我想用尽可能少的补丁工作来解决这个问题,所以修复所有发出警告的代码或多或少是不可能的,特别是因为我最终要扔掉它的大部分,只保留一个我想提取的特性。
但是我可以修改所有的文件(可能在开始的时候用findsed插入一个#pragma#define或类似的文件),我也可以在所有的目录中修补Makefile。但是,如果能够在不需要修补太多的情况下关闭和打开解决方案,那就太好了(如果可能的话,我不想要求太多)。
我找到并尝试了一些关于禁止警告的信息,例如this here,但是使用-i(或-isystem)或#pragma GCC system_header选项似乎不起作用,可能是因为被警告的文件是命令行中给出的文件,而不是包含的文件。#pragma因此被警告。

s3fp2yjn

s3fp2yjn1#

您可以设置gcc -w以禁止所有警告消息。

8i9zcol2

8i9zcol22#

你可以从命令行控制GCC警告。warning options有很好的文档记录。大多数选项以“-W”开始,每个选项都有一个“no”等价项。你可以使用-Wno-shadow来禁用与这类阴影问题相关的警告。
您可能还想给予一下Clang; better diagnostics是它的主要优点之一。

相关问题