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;
}
感謝您的回答。我只是想出了一個簡單的程序來試試吧,確實foo.m_i的價值是不確定的,如果我簡單地改變傳遞給linker對象文件的順序。你指出的簡單情況也很好,很容易理解。謝謝。 – leolong
@leolong如果更改鏈接順序更改結果,他們不在同一個翻譯單位。目標文件是單個翻譯單元的輸出。 –
@MarkRansom因爲在我的測試程序中,我從另一個CPP文件中定義的另一個靜態對象的構造函數叫做doSth()。 – leolong