在 GCC 下的代码中,我收到了很多这两种类型的警告。
warning: passing argument 1 of 'foo' from incompatible pointer type
and
warning: assignment from incompatible pointer type
我知道通常情况下,这两个警告是严重的警告,表明代码中确实存在错误。就我而言,无论这些情况发生在哪里,我都非常清楚自己在做什么,并且我知道我可以安全地忽略这些警告。 (是的,我确信这一点)
但现在我的代码已经增长到这样的程度,这些警告掩盖了其他任何内容,实际上隐藏了可能导致我遇到严重错误的潜在警告。所以我决定抑制他们。很快我就意识到我不知道该怎么办。我的 gcc 版本是 4.4.1,我知道我可以使用:
#pragma GCC diagnostic ignore "-Wname"
忽略我想要的任何警告。但从唯一又大又全面的清单 http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html在我发现的 GCC 警告中,我似乎找不到这两个是哪一个。我把它们一一挑选出来,并将它们变成错误,看看编译何时会因指针类型不兼容而停止,但没有效果,如下所示。
#pragma GCC diagnostic error "-Wimplicit-int"
#pragma GCC diagnostic error "-Waddress"
#pragma GCC diagnostic error "-Wreturn-type"
.... //e.t.c.
所以..问题是,有人知道这些警告的名称,以便我可以真正抑制它们吗?
EDIT
由于评论中的讨论,我必须澄清我的一个误解,它使我相信我必须抑制警告。我认为在指向结构的指针之间执行显式转换会涉及一些成本(无论多么微小)。
所以我的想法(现在我意识到是有缺陷的)是,既然我的程序可以工作并且已经在不同平台下工作了很长时间,为什么要添加工作来满足编译器的需求呢?
好吧,我现在意识到了,我把它写在这里,以防其他人偶然发现这个话题并有同样的想法。执行指针的显式类型转换不涉及任何成本,优点是:
- 编译器不再用警告来烦你
- 其他人可以知道你在那里是故意选角的并且没有犯错误
所以这里是为其他可能有同样问题的人提供的。