問題はstatic initialization order fiascoとして知られている。要するに
、あなたが 別のソースファイル内に存在する2静的オブジェクトのxとyがあると、x.cppとy.cppを言います。 yオブジェクト(通常はyオブジェクトのコンストラクタ)の 初期化で がxオブジェクトのいくつかのメソッドを呼び出すとします。
定数を使用する別の翻訳単位を使用している場合は、プログラムが機能しない可能性があります。場合によっては、ファイル同士がリンクされた順序である場合もありますが、一部のプラットフォームではドキュメント内で定義することさえあります(私はSolarisがここにあると思います)。
The problem also applies to builtin types such as int.よくある質問の例は以下のとおりです。この例を実行する場合
#include <iostream>
int f(); // forward declaration
int g(); // forward declaration
int x = f();
int y = g();
int f()
{
std::cout << "using 'y' (which is " << y << ")\n";
return 3*y + 7;
}
int g()
{
std::cout << "initializing 'y'\n";
return 5;
}
int main() {
std::cout << x << std::endl << y << std::endl;
return 0;
}
、出力は次のようになります。
(0されている) 'Y'
を初期化する 'Y' を使用して
したがって、最初にゼロ初期化が行われ、次に定数初期化(?)が行われます。
ソリューションが Construct On First Use Idiomです:
まず利用イディオムで構築物の基本的な考え方は、関数内であなたの 静的オブジェクトをラップすることです。
静的ロカオブジェクトは、制御フローが宣言に初めて到達したときに構築されます。
グローバルスコープ内の変数は常に*初期化されます。明示的に初期化されていない場合でも、システムはそれらを[* zero-initialize *](http://en.cppreference.com/w/cpp/language/zero_initialization)します。とにかく 'const'変数は明示的に初期化されなければなりません。 –
http://stackoverflow.com/questions/1005685/c-static-initialization-order –
こんにちは皆さん、ありがとうございます!私が見ている限り、組み込み型のグローバルオブジェクトの初期化は常にコンパイラによって処理されます。ローカルか非ローカルかは気にしないでください。 – Dusan