
「静的初期化順序の大失敗」の謎が明らかに
悪名高い「静的初期化順序の大失敗」 (SIOF) は、C プログラム内の複数のファイルに依存する静的変数が含まれている場合に発生します。初期化のためにお互いに。次の例を考えてみましょう:
// file1.cpp
extern int y;
int x = y + 1;
// file2.cpp
extern int x;
int y = x + 1;
ログイン後にコピー
質問:
-
file1.cpp のコンパイル中に、コンパイラは次のことを行います:
- y にストレージを割り当てますか?
- 初期化しますx?
-
file2.cpp のコンパイル中に、コンパイラは次の処理を行います:
-
file1.o と file2.o をリンクするときに、file2.o が最初に初期化されると、次の処理が行われます:
- x は初期値を受け取ります値が 0?
- x が残りますuninitialized?
答え:
C 標準 (3.6.2「非ローカルの初期化」による)オブジェクト"):
-
a. コンパイラーは y にストレージを割り当てしません。
b. コンパイラーはストレージを割り当てますx 用のストレージですが、初期化しません it.
-
a. コンパイラは x にストレージを割り当てしません。
b. コンパイラは y にストレージを割り当てますが、割り当てます初期化しません it.
-
a. x は初期値 0 を受け取ります。
b. x は受け取りません残る
説明:
-
ステップ 1: x と y は、他の初期化の前にゼロで初期化されます。
-
ステップ 2: いずれかx または y は動的に初期化されます (標準ではどちらを指定するかは指定されていません)。他の変数がゼロで初期化されるため、初期化された変数は値 1 を受け取ります。
-
ステップ 3: 次に、他の変数は動的に初期化され、値 2 を受け取ります。
以上がC での静的初期化命令の大失敗中に何が起こるか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。