2012-05-31 66 views
2

的順序如下代碼:GCC發出警告初始化的順序不匹配聲明

class C 
{ 
    int a, b; 
public: 
    C() 
    :b(0), a(0) 
    {} 
}; 

導致GCC抱怨初始化錯誤的順序。具體來說:

../AppSrc/MainForm.cpp: In constructor 'C::C()': 
../AppSrc/MainForm.cpp:51:9: warning: 'C::b' will be initialized after 
../AppSrc/MainForm.cpp:51:6: warning: 'int C::a' 

這裏有什麼大不了的,爲什麼發牢騷?這並不是說成員之間存在或可能存在相互依存關係。原始人,杜。

哦,我該如何關閉此警告或至少使其不那麼激進?

編輯:有很多方法可以在C++中拍攝自己的腳;成員相互依賴性就是其中之一。我意識到這一點,而且我避免了這一點,就像我會避免空指針解引用一樣。

任意init命令都可以非常安全,就像上面的代碼片段一樣。我對編譯器不滿意,並且無論如何都不承認這種情況並抱怨。我的意思是,它不會抱怨每一個不是立即前面都有空檢查的指針解引用,是嗎?

+9

最簡單也是最穩健的方式來沉默這個特別的警告是把成員和他們的初始化按照相同的順序。 – dasblinkenlight

+0

絕對不是最簡單的,考慮到在不同編譯器/設置下編譯時沒有問題的遺留代碼的數量。 –

+0

修復不正確的代碼總是一件好事,即使代碼只是*稍微*不正確。畢竟,你的公司確實有初級程序員,不是嗎? – dasblinkenlight

回答

6

在此特定示例中,警告可以安全地忽略。如果他們彼此依賴,你會遇到問題。您可以用-Wno-reorder將其關閉。

更好的重新排列它們。編譯器可能沒有什麼區別,但是你會習慣按照出現的順序初始化成員,這是一件好事。

+0

如果它們互相依賴,我會將init-first放入基地,以保證正確的初始化順序。糟糕的做法,這些相互依存關係。我寧願讓編譯器抱怨。 –

+0

@SevaAlekseyev,我不明白你爲什麼反對這個警告。 C++標準允許它不應該做的事情,GCC正在爲你檢測這個。通常,當你看到一個初始化列表時,你認爲它是按照它出現的順序處理的,但在這種情況下,它實際上會被重新排序。編譯器重新排序初始化似乎是一件好事。 –

+0

@ edA-qamort-ora-y我認爲他知道這一點,他想擺脫這個警告。他似乎知道這些影響。 –

0

這不像是存在或可能成爲成員之間的相互依賴關係。原始人,杜。

呃,除非有人改變它:

class C 
{ 
    int a, b; 
public: 
    C() 
    :b(a), a(0) 
    {} 
}; 

大多數人認爲這是更好地得到一個關於該問題發生前警告,這樣他們就可以修復代碼。你似乎是少數人想要離開代碼故意錯誤並抱怨編譯器。

任意初始化順序可以非常安全,就像上面的代碼片段一樣。

的一點是初始化的順序不是任意的,它總是在成員聲明的順序,我們中的一些希望,當我們寫錯誤的順序MEM-初始化被警告。

我很不滿意編譯器無法識別這些情況並抱怨。

如果你不喜歡的警告,關閉它,如何做到這一點是在文檔中(以及在更早的答案,所以你甚至不必看遠;-)

+0

我一直在使用C++超過15年。現在是我第一次看到編譯器抱怨。在不那麼遙遠的過去,這不是什麼大不了的,是嗎?相反,你是一個期望關注相互依存關係和訂單初始問題的人。 –

0

該是爲嗚嗚一個非常大的原因,見斯科特·邁爾斯C++有效項目13第57頁瞭解詳情。

或者正如他所說,第58頁:

class Wacko { 
    public: 
     Wacko(const char *s): s1(s), s2(0) {} 
     Wacko(const Wacko &rhs): s2(rhs.s1), s1(0) {} 
    private: 
     string s1, s2; 
}; 

Wacko w1 = "Hello World!"; 
Wacko w2 = w1;  

w2一樣w1