次のように、2 つのコンパイル ユニットがあるとします。
// a.cpp
extern int value2;
int value1 = value2 + 10;
// b.cpp
extern int value1;
int value2 = value1 + 10;
VC2010で試してみると、初期化value1
さvalue2
れて最初にゼロになります。両方ともvalue1
動的value2
に初期化されておらず、デフォルトの初期化は適用されませんか?
ありがとう、
次のように、2 つのコンパイル ユニットがあるとします。
// a.cpp
extern int value2;
int value1 = value2 + 10;
// b.cpp
extern int value1;
int value2 = value1 + 10;
VC2010で試してみると、初期化value1
さvalue2
れて最初にゼロになります。両方ともvalue1
動的value2
に初期化されておらず、デフォルトの初期化は適用されませんか?
ありがとう、
3.6.2/1 は、「静的ストレージ期間 (3.7.1) を持つオブジェクトは、他の初期化が行われる前にゼロ初期化 (8.5) される」と述べています。
そうです、それらはデフォルトで初期化されていません。しかし、それらはゼロで初期化されており、実際にint
は同じことです。クラスタイプの場合、必ずしも同じではありません。
とは言っても、ここでの動作は単に初期化の順序が指定されていないため、1 つの変数が 10 になり、もう 1 つの変数が 20 になり、どちらがどちらであるかは指定されていないということを約束するものではありません。他の理由で定義されていない可能性がありますが、考えられません。
すべてのグローバル変数は、他のすべての初期化が発生する前に、最初にゼロで初期化されます。
この動作については、次で説明し3.6.2 [basic.start.init] / 2
ます。
静的保存期間またはスレッド保存期間を持つ変数は、他の初期化が行われる前にゼロで初期化されます。
(これは C++0x FDIS によるものですが、C++98 標準も同じことを言っていると思います。)