2017-08-29 21 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の値は不確定です。あなたが指摘したシンプルなシナリオも素晴らしいと理解しやすいです。ありがとう。 – leolong

+0

@leolongリンク順序を変更すると結果が変わる場合、それらは同じ翻訳単位には含まれません。オブジェクトファイルは、単一の翻訳単位の出力です。 –

+0

@ MarkRansom私のテストプログラムでは、別のcppファイルで定義されている別の静的オブジェクトのコンストラクタからdoSth()を呼び出しました。 – leolong

関連する問題