GCC编译器警告溢出



编辑:我发现了一种使用GCC禁用第三方代码警告的方法。看看这篇文章:http://sphaleron.blogspot.se/2011/06/ignoring-gcc-warnings-on-per-file-basis.html或者正如bames53帖子所说!

我刚刚升级了我的GCC编译器,突然我得到了很多以前从未有过的警告。基本上它们都是从int到Sin16的转换当我没有指定它应该是Sin16

下面的例子应该抛出这样的警告:

int number = 6;
SDL_Rect rect = {number, number, number, number};

SDL_Rect需要一个Sint16作为输入。无论如何,当我检查新的警告时,我开始修复这些警告(因为为什么不呢?),令我惊讶的是,我从我添加的glow文件中收到了100多个警告,以便能够更有效地使用OpenGL进行绘制。我没有计划进入该代码只是为了修复警告。

你会怎么做?这有多重要?如果我不修复它们,有没有办法让我删除这些警告?

澄清:我总是修复更严重的警告,只是我代码中的所有警告都是缩小警告(在glew.c中它是"warning: 'variable' redeclare without dllimport attribute: previous dllimport ignored [- watattributes]|"),我想知道修复这些有多重要,特别是因为glew向我扔了一大堆。

您的项目应该始终是无警告的。将编译器设置为将警告视为错误是一种鼓励开发人员保持警告自由状态的好方法,尽管您必须监视并确保应该修复的警告不会仅仅因为在某个时刻更容易而被禁用。禁用警告应该需要审查。

任何不能修复的警告,因为它们在第三方头文件或其他地方,应该被静音。否则,它们会在输出中添加噪声,从而隐藏您可以并且应该修复的警告。

如果警告的来源是相对本地化的,你可以只在源中的那个位置禁用它:

// VC++
#pragma warning(push)
#pragma warning( disable : 4507 34)
#include <third_party_header.h>
#pragma warning(pop)
// clang
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wmultichar"
#include <third_party_header.h>
#pragma clang diagnostic pop
// GCC
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wuninitialized"
#include <third_party_header.h>
#pragma GCC diagnostic pop

如果警告发生在许多地方,你不能修复它们,因为它们是某种误报,你可以考虑在整个项目(或可能是一个模块)禁用警告与编译器标志

vc++: /wd4507

GCC/clang: -Wno-uninitialized


您还应该定期重新评估所有禁用的警告,以确保禁用它们的原因随着代码库和工具链的发展仍然有效。还要查找可以启用的新警告。


clang有一个发现新警告的有用工具;-Weverything标志。在GCC和clang上,-Wall实际上只启用编译器开发人员认为广泛适用的警告子集,并且具有相对严格的误报要求;基本上,它只是一组很好的默认警告。-Weverything启用编译器提供的所有警告。

而不是使用警告的"加法"策略,在你阅读编译器文档时,选择对你有利的警告来启用,我喜欢使用-Weverything-Wno-*标志列表相结合的"减法"策略。这样就可以自动使用新的警告。只要记住定期重新评估已禁用的警告,这样,如果您以前认为没有用处的警告得到了改进,那么您将看到改进并能够使用它。

你会怎么做?如果它们是我的源文件,我会修复它们,如果它们是我对开发没有影响或兴趣的外部代码,我会忽略它们。

这有多重要?这取决于你的优先级。但不修复它们可能不会使代码无法运行。然而,这是不好的做法,它会导致你在未来错过更多重要的警告。警告越多,对带有警告的文件的开发越活跃,清理它们就越有用。如果有很好的理由不去修复它们(比如第三方代码)……"工作太多"本身并不是一个好理由),我会将相关代码转移到指定为警告加载的子项目中,这样我就可以专注于我自己的工作,没有警告。

如果我不修复它们是有一种方法让我删除这些警告吗?

您可以使用make只编译 glew.c与选项-Wno-attributes。如果您真的不关心来自该文件的任何警告,请使用-w(注意这是小写w)。

下面是一个非常简单的makefile。请注意,每个命令行都以水平制表符t开头,#以注释开头。 <>之前#调用"make"或"make all"所有:主要。o。o glew.og++ -o projectName main。o。o glew。o -pedantic -Wall -Wextra -Werror主要。主要的,其他的,其他的g++ -c main.c -pedantic -Wall -Wextra -Werror其他。其他的,其他的,其他的c -pedantic -Wall -Wextra -Werrorglew。意思是"高兴"c -Wall -Wno-attributes或者,你可能想要像下面这样的东西:# g++ -c g++ .c -Wno-attributes# g++ + - g++ + - g++ +#使用"make clean"删除可执行文件和中间文件清洁:rm projectName *.o之前

您可以做的还有很多(参见make手册)。甚至有一些工具可以自动为你创建makefile .

最新更新