2012-02-25 36 views
4

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

忽略我想要的任何警告。但從我發現的GCC警告中唯一的big and comprehensive list,我似乎無法找到這兩個是哪個。我開始逐個挑選它們,並將它們轉化爲錯誤,以查看由於不兼容的指針類型而導致編譯停止的時間,但無法在下面找到。

#pragma GCC diagnostic error "-Wimplicit-int" 
#pragma GCC diagnostic error "-Waddress" 
#pragma GCC diagnostic error "-Wreturn-type" 
      .... //e.t.c. 

所以..問題是,沒有任何人知道這些警告的名字,這樣我可以真正抑制呢?

編輯

由於我要澄清一種誤解,認爲我有這意見的討論使我相信,我不得不抑制警告。我認爲在結構指針之間進行明確的轉換需要花費一些成本(不管多麼微不足道)。

所以我現在意識到的思想是有缺陷的,是因爲我的程序在不同的平臺下工作了很長時間,爲什麼要添加工作來滿足編譯器呢?

那麼我現在已經意識到,並且正在寫這裏,以防其他人在這個話題上絆倒,並有相同的思路。沒有參與執行指針的顯式類型轉換的成本,其優點有:

  • 編譯器停止嘮叨你的警告
  • 其他人可以知道你會做演員故意那裏並沒有犯錯

因此,這裏是任何其他人可能有相同的問題。

+2

請始終注意警告 - 他們在那裏是有原因的。用'-Wall'標誌設置編譯是一個非常好的主意 - 然後去解決警告。 – 2012-02-25 22:21:13

+1

出於好奇,絕不會懷疑你的天才,請問這是什麼原因導致了警告? – 2012-02-25 22:22:29

+0

@EdHeal我同意你的看法,這就是爲什麼我想禁用這兩個,因爲在我的代碼中他們沒有幫助我,而是掩蓋了其他可能有用的警告。 我需要解決的是編譯器禁止我的工作,而不是實際幫助我。我有理由忽視這些特定的警告。問題是如何做到這一點,以便我可以專注於「真實」的警告 – Lefteris 2012-02-25 22:25:27

回答

7

如果您使用-fdiagnostics-show-option選項,GCC會顯示警告的名稱,然後您可以禁用它。

禁用警告雖然可能不是一個好主意:如果稍後出現此警告的合法情況,您將不會了解它。

您最好修改代碼以防止發出警告。就你而言,這與添加顯式指針轉換一樣簡單。

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

使用顯式轉換將使任何讀取代碼的人都清楚,更改指針類型是故意的。

+0

感謝您的回答。我知道明確的演員會刪除警告,但我擔心劇組的成本。因爲我正在做的事情發生在我的代碼模塊的很大一部分。 必須承認我不確定什麼是成本,以及編譯器如何實際執行強制轉換。所有警告不是基本的,而是相當大的結構。這完全歸功於我對結構繼承的「模擬」。 – Lefteris 2012-02-25 22:37:13

+1

實際上,似乎-fdiagnostics-show-option顯示幾乎所有警告的名稱,只有幾個警告。我感興趣的兩個警告是其中的幾個。從這裏閱讀:http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html 似乎你只能禁止通過-fdiagnostics-show-option顯示的警告。似乎實際上在gcc下禁止它們不是一種選擇 – Lefteris 2012-02-25 22:51:36

+0

@Lefteris:顯式轉換的成本與隱式轉換的成本相同。 – 2012-02-25 22:53:12

相關問題