我最近接管了一个大而古老的项目。它编译没有问题,但由于代码太旧而以前的开发人员并不总是以他们应该的方式做事,所以我用现代编译器得到了很多警告。
现在我更改了部分代码,有时会引入错误。当我重新编译项目时,会发生很多警告输出,在输出结束时,我看到如下消息:
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);
^
我现在的问题是找到错误消息。如果我能关闭警告会很容易,因为错误信息将是最后打印的内容。
那么有没有办法告诉编译器不要发出任何警告或至少在最后打印错误消息(这足以解决我的问题)?
我想用尽可能少的补丁工作来解决这个问题,因此修复发出警告的所有代码事件或多或少是不可能的,特别是因为我要把它的大部分内容扔掉结束,只保留一个我想要提取的功能。
但是,我可以更改所有文件(可能在开头使用#pragma
和#define
插入find
或sed
或类似文件),我也可以修改所有目录中都有Makefile
个。然而,能够在不必过多补丁的情况下关闭和打开解决方案会很好(如果可能的话,我不想要求太多)。
我发现并尝试了一些抑制警告的信息,例如: G。 this here,但使用选项-i
(或-isystem
)或#pragma GCC system_header
似乎不适用于我的情况,可能是因为被警告的文件是命令中给出的文件行,不是包含文件。由于这个原因,#pragma
正在被警告。
答案 0 :(得分:1)
您可以设置gcc -w
以禁止所有警告消息。
答案 1 :(得分:1)
您可以从命令行控制GCC警告。 warning options有很好的记录。大多数选项以“-W”开头,每个选项都有一个“no”等价物。您可以使用-Wno-shadow
来禁用与这些类型的阴影问题相关的警告。
您可能还想尝试Clang; better diagnostics是其主要优势之一。