2013-10-15 84 views
5

將-O2 -Wall標誌添加到gcc(4.4.6)後清除警告代碼。 我在一些遺留代碼中有很多警告。這是非常簡化的版本來演示該問題:gcc - 刪除「在此函數中未初始化」使用警告

1 #include <cstdio> 
    2 
    3 bool init(bool& a) 
    4 { 
    5  return true; 
    6 } 
    7 
    8 int main() 
    9 { 
10  bool a; 
11 
12  if (!init(a)) 
13  { 
14   return 1; 
15  } 
16 
17  if (a) 
18  { 
19   printf("ok\n"); 
20  } 
21 } 

當編譯爲 「海灣合作委員會的main.cpp -02 -Wall」 我收到:

main.cpp:17: warning: `a' is used uninitialized in this function 

在實際的代碼時,init()返回true只有在初始化「a」時纔有效,所以未初始化的「a」沒有用處。

Whan可以解決警告。

+0

要編譯生成未定義行爲的代碼,但使用的是'-Wall'?當你想知道你的UB課程爲什麼不起作用時,你會回來嗎? – DanielKO

回答

9

更改bool a;bool a = false;將刪除此警告。

編譯器不會知道init(a)是爲了「初始化」,它只能看到該程序試圖調用函數與未初始化的變量。

+2

但'init()'從不向其參數寫入任何東西,所以編譯器是正確的,沒有初始化發生。 – DanielKO

7
int main() 
{ 
    bool a = false; 
    ... 

初始化所有變量,永遠!

+5

我不同意。初始化*不應該*需要初始化的事情可能導致隱藏錯誤。這可能是一個長時間的咆哮,但我將把它留在這裏的例子中,對於局部變量的特殊情況:假設你定義一個局部*將*設置在一個分支或下面的某個'if'結構中的另一個。在decl處保持未初始化狀態。意味着如果你沒有在所有分支中設置它,你會得到一個警告。將其初始化爲0(作爲一般練習,不用考慮)會抑制該警告,因此編譯器將不再幫助您知道(通過缺少警告)它始終設置。 – greggo

7

如果您不想初始化一些值的變量,你可以使用GCC的diagnostic pragmas

#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-Wuninitialized" 
    if(a) 
#pragma GCC diagnostic pop 

,如果你的代碼有問題的服務表現時,一切都將被初始化,這可能是得心應手。在你的例子中,當然,使用bool a = false;顯然是更好的選擇。

+0

可能,第二次推動應該是流行音樂。我相信第一次推動是不必要的。 – jxh

+0

@jxh謝謝,修正了流行音樂的答案。推OTOH是必要的,因爲沒有推動的彈出只會從命令行恢復選項。如果有人想在上面嵌套另一個push/pop(對於更大的上下文),我會彈出其他開發人員推送的任何內容,這會造成混亂。因此,最好的做法是始終擁有匹配的本地推/拉對。 –

+0

下面是一個未初始化值可能有用的例子,如果它們在編譯器中適當實現:我使用_mm_set_epi64(dontcare,x)將m64向量轉換爲m128,其中dontcare是非空間化的,我真的不關心它是什麼是因爲該值在_mm_unpacklo_下游中使用。如果我在'dontcare'中放置了一個特定的值,我可能需要額外的代碼來生成它。編譯器知道這個值不太可能(tho可能)知道這個值不關心操作符,並且可以刪除該代碼。但是,如果我不啓動不關心,整個事情可能會被優化器丟棄。:-( – greggo

3

加-Wno-未初始化到您的編譯選項

+1

-1。禁用編譯警告 - 在這種情況下 - 顯示程序員在代碼中存在實際問題(在這種情況下,由未定義的行爲引起)絕對不是一個好的做法。 –

+1

這是一個關於如何抑制該警告的答案,而不是良好的做法。 – tristan

相關問題