在我在GCC下的代码中,我收到了很多关于这两种类型的警告.
warning: passing argument 1 of 'foo' from incompatible pointer type
Run Code Online (Sandbox Code Playgroud)
和
warning: assignment from incompatible pointer type
Run Code Online (Sandbox Code Playgroud)
我知道通常情况下,这两个是严重的警告,表明代码中存在一些错误.就我而言,无论发生在哪里,我都非常清楚我在做什么,我知道我可以放心地忽略这些警告.(是的,我很确定)
但是现在我的代码已经发展到这样的程度,以至于这些警告掩盖了其他任何事情,实际上隐藏了可能导致我讨厌的错误的潜在警告.所以我决定抑制它们.很快我意识到我不知道怎么做.我的gcc版本是4.4.1,我知道我可以使用:
#pragma GCC diagnostic ignore "-Wname"
Run Code Online (Sandbox Code Playgroud)
忽略我想要的任何警告.但是从我发现的唯一一个大而全面的海湾合作委员会警告清单中,我似乎无法找到这两个警告.我开始逐一挑选它们并将它们变成错误,以查看由于不兼容的指针类型而导致编译停止的时间,但是无法获得如下所示.
#pragma GCC diagnostic error "-Wimplicit-int"
#pragma GCC diagnostic error "-Waddress"
#pragma GCC diagnostic error "-Wreturn-type"
.... //e.t.c.
Run Code Online (Sandbox Code Playgroud)
所以......问题是,是否有人知道这些警告的名称,以便我可以实际禁止它们?
编辑
由于评论中的讨论,我必须澄清一个误解,我曾让我相信我必须禁止警告.我认为在指向结构的指针之间执行显式转换会涉及一些成本(无论多么微不足道).
所以我的想法,我现在意识到是有缺陷的,因为我的程序正在运行并且已经在不同的平台上工作了很长时间,为什么要添加工作来满足编译器?
好吧,我现在意识到了,我正在写这里,以防其他人偶然发现这个话题并且有相同的思路.执行指针的显式类型转换不需要任何成本,优点是:
所以这里是其他任何可能有同样问题的人.
如果您使用该-fdiagnostics-show-option
选项,GCC将显示警告的名称,然后您可以将其禁用.
但是,禁用警告可能不是一个好主意:如果稍后出现此警告的合法情况,您将无法了解它.
您最好修复代码以防止出现警告.在您的情况下,这就像添加显式指针强制转换一样简单.
float f = 1.23;
char *a = &f; //warning
char *b = (char*)&f; //no warning
Run Code Online (Sandbox Code Playgroud)
使用显式强制转换将使任何阅读代码的人都清楚地知道更改指针类型是故意进行的.