2013-05-28 32 views
4

假設我有以下代碼:跨文件的依賴變量之間初始化的順序是什麼?

extern std::string first_string; //defined in another file 
std::string another_string(first_string + "some other string"); 

我的問題是:

是它的標準保證first_string永遠another_string之前被初始化?

如果沒有,應該在實踐中避免這樣的代碼?

我試圖通過閱讀C++標準N3485第3.6節和3.7節來了解這一點。但我沒有找到一個好的答案。我非常感謝您在草擬答案時能夠指出標準的一部分。 謝謝你的幫助。

回答

5

訂單未定義。

C++ FAQ

假設你有兩個靜態對象x和y存在於獨立 源文件,說x.cpp和y.cpp的。進一步假設y對象的初始化(通常是y對象的構造函數) 在x對象上調用某種方法。

就是這樣。就這麼簡單。

悲劇是你有50%-50%的機率死亡。如果x.cpp的編譯單元 碰巧首先被初始化,那麼全部爲 。但是,如果y.cpp的編譯單元首先被初始化,則 然後y的初始化將在x初始化之前運行,並且 您將被烘烤。例如,y的構造函數可以調用x對象上的方法,但x對象尚未構造。

並參見How do I prevent the "static initialization order fiasco"?

+0

+1謝謝。我應該徹底閱讀C++ FAQ。 – taocp

3

這是未定義的;比照What's the "static initialization order fiasco"?。在標準中的相關部分是§3.6.2「非本地變量的初始化」,它說

否則,變量的初始化不定對於測序,以一個變量的不同定義的初始化翻譯單位。

+0

+1謝謝你指點我的標準。 – taocp

相關問題