在GCC下抑制不兼容指针类型特定警告

4
在我的GCC代码中,我收到了许多这两种类型的警告。
warning: passing argument 1 of 'foo' from incompatible pointer type

并且

warning: assignment from incompatible pointer type

我知道通常情况下,这两个警告表示代码出现了严重问题。但在我的情况下,无论发生在哪里,我都非常清楚自己在做什么,并且我知道可以安全地忽略这些警告。(是的,我确定)
但现在我的代码已经变得如此庞大,以至于这些警告掩盖了其他任何东西,实际上隐藏了可能导致糟糕错误的潜在警告。所以我决定禁用它们。很快我意识到我不知道该怎么做。我的gcc版本是4.4.1,我知道可以使用:
#pragma GCC diagnostic ignore "-Wname" 

我想忽略任何警告。但是在我找到的唯一一份GCC警告列表中,这个列表并没有包含这两个警告。我已经逐一选取他们并将其转化为错误以查看编译过程中是否由于不兼容指针类型而停止,但是都无济于事,如下所示。
#pragma GCC diagnostic error "-Wimplicit-int"   
#pragma GCC diagnostic error "-Waddress"
#pragma GCC diagnostic error "-Wreturn-type"
           .... //e.t.c.

所以,问题是,有没有人知道这些警告的名称,以便我可以实际地抑制它们?
编辑
由于评论中的讨论,我必须澄清一个误解,这使我相信我必须抑制这些警告。我认为执行指向结构体的指针之间的显式强制转换会涉及一些成本(无论多么微小)。
所以我的想法,我现在意识到是错误的,因为我的程序正在不同的平台上工作并已经工作了很长时间,为什么要添加工作来满足编译器呢?
好吧,我现在意识到了,并在这里写下来,以防其他人碰巧遇到这个主题并有相同的思路。执行指针的显式类型转换没有任何成本,而优点是:
编译器停止用这些警告批评你
其他人可以知道您在那里故意进行了转换,并且没有犯错误。
对于任何可能有相同问题的人,这就是答案。

2
始终注意警告 - 它们存在是有原因的。使用“-Wall”标志进行编译是一个非常好的主意 - 然后开始修复警告。 - Ed Heal
1
出于好奇,绝不是怀疑你的天才,我可以问一下是什么代码导致了这个警告吗? - Kerrek SB
@EdHeal 我同意你的观点,这也是我想要禁用它们的原因,因为在我的代码中它们并没有帮助我,反而掩盖了其他可能有用的警告信息。我需要解决的问题是编译器阻碍了我的工作,而不是真正帮助我。我有我的理由忽略这些特定的警告信息。问题是如何禁用它们,以便我可以专注于“真正”的警告信息。 - Lefteris
GCC 4.6 会为每个警告加上特定的标志,以触发或平息它。 - Kerrek SB
@Lefteris - 或许可以使用 grep 命令? - Ed Heal
@KerrekSB,感谢您提供的信息。是时候升级到4.6了。 - Lefteris
1个回答

7
如果您使用-fdiagnostics-show-option选项,则GCC将向您显示警告的名称,然后您可以禁用它。 但是禁用警告可能不是一个好主意:如果稍后存在此警告的合法情况,您将不了解其情况。 最好的方法是修复代码以防止出现警告。在您的情况下,只需添加显式指针转换即可达到目的。
float f = 1.23;
char *a = &f; //warning
char *b = (char*)&f; //no warning

使用显式转换将清楚地告诉阅读代码的人更改指针类型是有意进行的。

1
实际上,似乎“-fdiagnostics-show-option”会显示几乎所有警告的名称,除了其中的一些。我感兴趣的两个警告就在这几个警告之中。从这里的阅读中得知:http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html似乎您只能抑制通过“-fdiagnostics-show-option”显示的警告。看起来在GCC下实际上无法禁止它们。 - Lefteris
@Lefteris:显式转换的成本与隐式转换相同。 - Oliver Charlesworth
@OliCharlesworth,如果我们有两个结构体,其中一个结构体具有另一个结构体数据的子集,并且我们将指向较大结构体的指针传递给期望指向小结构体的指针的函数,则会发生隐式转换,成本与显式转换相同吗?那么...实际上是否存在任何成本呢?底层会发生什么?如果成本几乎相同,那么我意识到我可以使用显式转换来填充它... - Lefteris
1
@Lefteris:除非你在一个神秘的平台上,否则什么都不会发生,因为数据指针将具有相同的表示形式。 - Oliver Charlesworth
1
@Lefteris:这也告诉代码的其他读者/维护者,你知道自己在做什么(即它是一个有意的行为)。 - Oliver Charlesworth
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接