2014-04-09 24 views
4

This Question分開是關於讓gcc編譯器,當你犯了一個錯字,警告和自身初始化的變量。爲什麼-Winit自我從-Wuninitialized

 int f() 
     { 
     int i = i; 
     return i; 
     } 

原來你需要的-Winit-self flag除了-Wuninitialized

-Winit-self(C,C++,Objective-C和Objective-C中++只)發出警告未初始化的變量,是用自己初始化。注意 此選項只能與-Wuninitialized選項,這反過來 只-O1及以上的作品被使用。

我的問題是:爲什麼這不是-Wuninitialized的默認行爲?什麼是你想警告未初始化變量的用例,而不是自初始化變量,這同樣很麻煩?

回答

2

它看起來像這樣的錯誤報告Warn about member variables initialized with itself有對此的解釋(重點煤礦):

我與安德魯達成一致,一個(一)錯誤應該始終提醒,它應該是獨立的 - Winit自我,它存在使-Wuninitialized不警告自初始化的自動變量的共同(但有問題的)做法沉默警告

它可能被稱爲一個值得懷疑的做法,因爲它是undefined behavior in C++ to self initialize an automatic variable並且錯誤報告是一個C++錯誤報告。

+0

發生這種情況時,有時初始化是不重要的,像填充的32位數字逐位(考慮利用公知的排列置換另一個32位號碼)。在這種情況下,初始化並不重要,並且可能會使某人對算法的工作方式感到困惑,因此您可以使用idom uint32_t val = val;向讀者指示您有意將該值未初始化。 –

+0

@SteveCox當然,我可以看到,但它仍然值得懷疑,因爲它是未定義的行爲,編譯器可以用未定義的行爲做一些奇怪的事情。 –

+0

當然,我並不真正做到這一點,我剛看到它的地方,人們希望能督促未實際投入的'XOR EAX編譯器,eax'但仍想隱藏未初始化變量的警告。 –