2017-08-29 51 views
2

我讀了靜態全局變量的動態初始化保證,如果他們是在同一個翻譯單元中定義的順序發生。然後我想知道是否可以保證靜態全局變量必須已經動態初始化,當它在相同的翻譯單元中定義的靜態方法使用它時。靜態變量保證在靜態方法在同一個翻譯單元中使用時被初始化?

//Foo.h 
class Foo 
{ 
public: 
    Foo(int i) {m_i = i;} 
    int m_i; 
}; 

//X.h 
class X 
{ 
    static void doSth(); 
    static Foo foo; 
}; 

//X.cpp 
Foo X::foo(2); 
void X::doSth() 
{ 
    //Is it guaranteed that foo has been properly initialized here? 
    std::cout << foo.m_i << std::endl; 
} 

回答

4

簡答:不,全局初始化與靜態方法無關。

下面是說明了爲什麼一個簡單的場景:如果什麼Foo構造函數調用doSth()

如果你需要這樣的保證,你需要使用函數範圍的靜態變量。

+0

感謝您的回答。我只是想出了一個簡單的程序來試試吧,確實foo.m_i的價值是不確定的,如果我簡單地改變傳遞給linker對象文件的順序。你指出的簡單情況也很好,很容易理解。謝謝。 – leolong

+0

@leolong如果更改鏈接順序更改結果,他們不在同一個翻譯單位。目標文件是單個翻譯單元的輸出。 –

+0

@MarkRansom因爲在我的測試程序中,我從另一個CPP文件中定義的另一個靜態對象的構造函數叫做doSth()。 – leolong