编辑:我找到了一种使用GCC禁用第三方代码警告的方法。在这里看看这篇文章:http://sphaleron.blogspot.se/2011/06/ignoring-gcc-warnings-on-per-file-basis.html 或者正如bames53帖子所说的那样!
我刚刚升级了我的GCC编译器,突然间我收到了前所未有的大量警告。基本上,当我没有指定它应该是Sint16时,每个人都是从int到Sin16的转换。
下面这个例子应该发出这样的警告:
int number = 6;
SDL_Rect rect = {number, number, number, number};
SDL_Rect期望Sint16作为输入。无论如何,我开始修复这些警告(因为为什么不呢?)当我检查新的警告时,我惊讶地收到了来自glew文件的100多个警告,我添加了以便能够更有效地使用OpenGL进行绘制。我没有计划进入该代码只是为了修复警告。
你会做什么?这有多重要?如果我不修复它们,我有办法删除这些警告吗?
澄清:我总是修复更严厉的警告,只是我的代码中的所有警告都是缩小警告(在glew.c中它是“警告:'变量'重新声明没有dllimport属性:之前的dllimport忽略了[-Wattributes] | “)我想知道修复它们有多重要,特别是因为glew向我扔了一大堆。
答案 0 :(得分:3)
您的项目应始终免费警告。设置编译器将警告视为错误是鼓励开发人员保持无警告状态的好方法,尽管你必须观察并确保应该修复的警告不要因为在某个特定时刻更容易被禁用而被禁用。禁用警告需要进行审核。
任何无法解决的警告,因为它们位于第三方标题或其他方面,都应该被静音。否则,他们会在输出中添加噪音,以隐藏您可以并且应该修复的警告。
如果警告的来源相对本地化,您可以仅为源中的该位置禁用它:
// 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-*
个标志。这样就可以自动使用新警告。请记住定期重新评估已禁用的警告,以便如果您之前未发现有用的警告,则会看到改进并能够使用它。
答案 1 :(得分:2)
你会做什么? 如果它们是我的源文件,我会修复它们,如果它们是我对开发没有影响/兴趣的外部代码,我会忽略它们。
这有多重要? 这取决于你的优先级......但不修复它们可能不会使代码无法运行。但是,这是不好的做法,它可能会导致您将来错过更重要的警告。您拥有的警告越多,对带有警告的文件的开发越活跃,清理它们就越有用。如果有充分的理由不修复它们(就像它的第三方代码......“太多工作”本身并不是一个好理由),我会将相关代码移动到指定为警告负载的子项目中我可以集中注意力于自己的工作。
如果我不修复它们,我有办法删除这些警告吗? 听起来像降级你的编译器就会这样做。
答案 2 :(得分:1)
您可以使用make
使用选项glew.c
编译 -Wno-attributes
。如果您真的不关心该文件中的任何警告,请使用-w
(请注意,这是一个小写的w)。
一个非常简单的makefile如下。请注意,每个命令行都以水平标签\t
开头,#
开始发表评论。
# invoke with "make" or "make all" all : main.o other.o glew.o g++ -o projectName main.o other.o glew.o -pedantic -Wall -Wextra -Werror main.o : main.c other.h glew.h g++ -c main.c -pedantic -Wall -Wextra -Werror other.o : other.c other.h g++ -c other.c -pedantic -Wall -Wextra -Werror glew.o : glew.c glew.h g++ -c glew.c -Wall -Wno-attributes # alternatively, you might want something like one of the following: # g++ -c glew.c -Wno-attributes # g++ -c glew.c -w # use "make clean" to remove the executable and intermediate files clean : rm projectName *.o
你可以做更多事情(见the make
manual)。甚至有工具可以自动为您创建makefile。