2016-07-15 7 views
1

私が正しく理解していればゼロにvarを設定しますだけではそう、静的変数は複数の初期化を受けますか?

  • 静的変数は、任意の初期化が示されているかどうかをゼロに初期化され、static int var;

    //#include stuff 
    const int x=5; 
    . 
    . 
    int main() 
    { 
    static int var=x; 
    . 
    . 
    } 
    

    を考えるとstatic int var=x;もにvarを設定します最初はzeroです。

  • static int var=x;はゼロ初期化後にIIRCが実行される定数式初期化を行います。

静的変数initialized multiple times - フレーズ自体は矛盾していますか?

+0

あなたの質問は正確です。何が起こったのかを正確に記述しました。「x」は概念的に「0」と「5」に設定されています。 –

+0

@ M.M:そうですね、ありがとうございました。そのような実装を使用していますか? – sjsam

+0

どういう意味ですか? –

答えて

4

C++ 14本の状態:非ローカル変数

3.6.2初期...静的ストレージ期間(3.7.1)またはスレッドストレージ と

変数その他の初期化が行われる前に、持続時間(3.7.2)はゼロ初期化(8.5) になります。

これは、この質問の基礎であるようです。

定数初期化が行われる。

は、[...]

これは一定の初期化の定義が続きます。長い話を短くするには、const int x=5;static int var=x;の両方が定数の初期化の要件を満たしているように見えます。

これに基づいて、これは「静的変数が複数回初期化されている」ことを示唆しているようです。

前方鍛造:

を一緒に、ゼロ初期化及び定数初期化が 静的初期化と呼ばれます。他のすべての初期化は動的な の初期化です。静的な初期化は、いずれかの動的初期化が行われる前に実行されます。だから、

、ゼロ初期化し、一定の初期化の両方、ここで問題対象となっている「複数」の初期化、動的初期前を行わなければなりません。

これからは、技術的には、「静的変数は複数回初期化されている」という主張は真実ですが、実際にそれを観察する方法はありません。何かを観察するには動的初期化が必要です。静的な初期化が完了するまで、動的初期化は行われません。

これから、3.6.2で定義されている用語 "静的初期化"は、実際には "静的初期化失敗"と同じ "静的初期化"ではありません。私には、「静的初期化失敗」は実際には「動的初期化失敗」と呼ばれるべきだと思う。

+0

サムイさんありがとうございます。よく説明される@ sam-varshavchik – sjsam

関連する問題