禁止GCC下的不兼容指针类型特定警告

在我在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" 

忽略我想要的任何警告。 但是从我发现的唯一一个大而全面的海湾合作委员会警告清单中,我似乎无法找到这两个警告。 我开始逐一挑选它们并将它们变成错误,以查看由于不兼容的指针类型而导致编译停止的时间,但无效如下。

 #pragma GCC diagnostic error "-Wimplicit-int" #pragma GCC diagnostic error "-Waddress" #pragma GCC diagnostic error "-Wreturn-type" .... //etc 

所以..问题是,有没有人知道这些警告的名称,以便我可以实际抑制它们?

编辑

由于评论中的讨论,我不得不澄清一种误解,我误以为我不得不相信我必须禁止警告。 我认为在指向结构的指针之间执行显式转换会涉及一些成本(无论多么微不足道)。

所以我的想法,我现在意识到是有缺陷的,因为我的程序正在运行并且已经在不同平台下工作了很长时间,为什么要添加工作来满足编译器?

好吧,我现在意识到了,我正在写这里,以防万一其他人偶然发现这个话题,并有相同的思路。 执行指针的显式类型转换不需要任何成本,优点是:

  • 编译器停止用警告唠叨你
  • 其他人可以知道你故意在那里做演员并且没有犯错

所以这里是其他任何可能有同样问题的人。

如果使用-fdiagnostics-show-option选项,GCC将显示警告的名称,然后您可以禁用它。

但是,禁用警告可能不是一个好主意:如果以后出现此警告的合法情况,您将无法了解它。

您最好修复代码以防止出现警告。 在您的情况下,这就像添加显式指针强制转换一样简单。

 float f = 1.23; char *a = &f; //warning char *b = (char*)&f; //no warning 

使用显式强制转换将使任何阅读代码的人都清楚地知道更改指针类型是故意进行的。