2012-03-26 17 views
6

私はこのコードを持っていた:静的変数をリテラルでない値で初期化できないのはなぜですか?

int foo(void){ 
    return 1; 
} 

int main(void){ 
    static const int x = foo(); 

    //do stuff 
    return 0; 
} 

をしかし、私は非const値と静的変数の初期化に関するエラーを得ました。私はそれがconst指定子と何か関係があると思ったが、それはしなかった。なぜそれだけでそれを置くことができない、なぜコンパイラはただ、もっと重要なことは、使用されるまでstatic int x変数の初期化を遅らせる、とすることはできません、今

int foo(void){ 
    return 1; 
} 

int main(void){ 
    static int x = 0; 
    if (x == 0) x = foo(); 

    //do stuff 
    return 0; 
} 

:私は、constキーワードをドロップし、これをやって終了しました読み書きセクションを作成し、コンパイル時には書かれていないことを強制するだけです。私はconststaticというキーワードを使ってコード内のセマンティクスを改善したいと思っていますが、コンパイラがこれをどのように処理しているかは気にしません。

私のC標準の理解は間違っていますか?または私のコンパイラは吸うのですか?それはMSVC 9.0です。

+1

メイン・グッドの静的変数とは何ですか? – tchap

+0

'x'はあなたの例の文脈でローカル変数のように見えます。なぜこれを静的にしたいのですか? –

+0

@ValAkkapeddi:しばしば、その関数を呼び出すたびに再初期化する必要はありません。 –

答えて

8

Cが必要です。 C規格から

(C99、6.7.8p4)「は静的記憶域期間を持つオブジェクトの初期化子内のすべての式は、定数式または文字列リテラルでなければなりません」。

const修飾子は、定数ではなく読み込み専用であることに注意してください。 constオブジェクトはC.

静的オブジェクトは静的オブジェクトの初期化が行われるという事実に関連している非定数値によって初期化することができない理由で一定ではない(「起動をプログラムする前に」 C99、6.2.4p3)。

+0

Cで定数オブジェクトと定数の違いを教えてください。Cの定数はリテラル値ですか? – Spidey

+0

Cでの定数式の定義は非常に限定されています。これはC99の6.6定数式で定義されています(http://port70.net/~nsz/c/c99/n1256.html#6.6)。 –

+0

@Spidey定数は基本的にスカラーリテラルです(C99、6.4.4を参照)。定義のために。定数は定数式です。 'const'オブジェクトは、定数式でも定数式でもありません。 – ouah

1

初期化の値は、コンパイル時またはリンク時に決定する必要があります。 Cには、プログラムの起動時に実行できるコンストラクタの概念はありません。

1

この制約は、C標準のセクション6.7.8/4から来ているので、それはちょうどあなたのコンパイラではありません。

静的記憶域期間を持つオブジェクトの初期化子のすべての式は定数式または文字列でなければなりませんリテラル。

この理由は、確かにそれをを禁止しないながらC++標準とは異なり、Cのsdoesは(前のランの初期化のためのエントリポイントを提供するために実行環境を必要としないことである;方法と静的初期化のタイミングを(5.1 .2)は、が不特定)です。

関連する問題