Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
禁止GCC下的不兼容指针类型特定警告_C_Gcc_Warnings - Fatal编程技术网

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

禁止GCC下的不兼容指针类型特定警告,c,gcc,warnings,C,Gcc,Warnings,在GCC下的代码中,我收到了很多这两种类型的警告 warning: passing argument 1 of 'foo' from incompatible pointer type 及 我知道,通常情况下,这两个是严重的警告,表明代码中确实存在错误。在我的情况下,无论这些警告发生在哪里,我都非常清楚我在做什么,我知道我可以安全地忽略这些警告。(是的,我确信这一点) 但现在我的代码已经发展到这样的程度,这些警告盖过了其他任何东西,实际上隐藏了潜在的警告,可能会导致一个讨厌的bug。所以我决定

在GCC下的代码中,我收到了很多这两种类型的警告

warning: passing argument 1 of 'foo' from incompatible pointer type

我知道,通常情况下,这两个是严重的警告,表明代码中确实存在错误。在我的情况下,无论这些警告发生在哪里,我都非常清楚我在做什么,我知道我可以安全地忽略这些警告。(是的,我确信这一点)

但现在我的代码已经发展到这样的程度,这些警告盖过了其他任何东西,实际上隐藏了潜在的警告,可能会导致一个讨厌的bug。所以我决定抑制它们。很快我意识到我不知道怎么做。我的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.
所以。。问题是,有没有人知道这些警告的名称,这样我就可以实际禁止它们

编辑

由于评论中的讨论,我必须澄清我的一个误解,这使我相信我必须禁止警告。我认为在指向结构的指针之间执行显式强制转换需要一些成本(无论多么微小)

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

我现在意识到了,我在这里写这篇文章,以防其他人在这个话题上有同样的想法。执行指针的显式类型转换不涉及成本,其优点是:

  • 编译器停止用警告来烦扰您
  • 其他人可以知道你是故意在那里投的,没有犯错误

因此,这是为可能有相同问题的其他人准备的。

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

但是,禁用警告可能不是一个好主意:如果以后出现此警告的合法案例,您将不会知道

你最好修复你的代码以防止警告。在您的例子中,这与添加显式指针强制转换一样简单

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

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

请始终注意警告-这些警告是有原因的。使用
-Wall
标志集进行编译,然后着手修复警告,这是一个非常好的主意。出于好奇,我不想怀疑你的天才,请问这段代码是什么导致了警告?@EdHeal我同意你的看法,这就是为什么我想禁用这两个,因为在我的代码中,它们对我没有帮助,相反,它们掩盖了其他可能有用的警告。我需要修复的是编译器抑制了我的工作,而不是实际帮助我。我有理由忽略这些特定的警告。问题是如何做到这一点,以便我能够专注于“真正的”警告GCC 4.6使用用于触发或消除警告的特定标志来装饰每个警告。@Lefteris-也许使用
grep
吧?谢谢你的回答。我知道明确的演员阵容会消除警告,但我担心演员阵容的成本。因为我正在做的事情发生在我代码模块的很大一部分。我必须承认,我不确定成本是多少,以及编译器实际上是如何实现强制转换的。所有警告都不是在基本体上,而是在相当大的结构上。这都是由于我对结构继承的“模拟”。实际上,-fdiagnostics show选项似乎显示了几乎所有警告的名称,只有少数警告除外。我感兴趣的两个警告就是其中之一。从这里阅读:您似乎只能禁止通过-fddiagnostics show选项显示的警告。似乎在gcc下抑制它们并不是一个好办法option@Lefteris:显式强制转换的成本与隐式强制转换的成本相同。@Lefteris:除非你在一个深奥的平台上,否则什么都不会发生,因为数据指针都有相同的表示。@Lefteris:它还告诉代码的其他读者/维护者,您知道自己在做什么(即,这是故意的行为)。
float f = 1.23;
char *a = &f; //warning
char *b = (char*)&f; //no warning