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の値は不確定です。あなたが指摘したシンプルなシナリオも素晴らしいと理解しやすいです。ありがとう。 – leolong
@leolongリンク順序を変更すると結果が変わる場合、それらは同じ翻訳単位には含まれません。オブジェクトファイルは、単一の翻訳単位の出力です。 –
@ MarkRansom私のテストプログラムでは、別のcppファイルで定義されている別の静的オブジェクトのコンストラクタからdoSth()を呼び出しました。 – leolong