8
#include <stdio.h>
int foo(){
    return 1;
}
int main(void) {
    static int q = foo(); 
    return 0;
}

ここに同じリンクがあります。これは C コードであり、C++ ではありません。C++ では正常にコンパイルおよび実行されますが、C では正常に実行されません。

このコードはコンパイル エラーが発生していました。誰かがエラーになる理由を説明できますか? 静的メンバーは定数値によってのみ初期化できますか? C++ では、宣言後に static メンバーを DEFINE する必要がありますが、なぜ C では必要ないのですか? 同様のクエリまたは適切な回答を持つスレッドが見つかりませんでした。

4

3 に答える 3

7

グローバル変数と静的変数は、コンパイル時に既知の定数式でのみ初期化できます。関数を呼び出すfoo()ことは、定数式を使用することを構成するものではありません。さらに、グローバル変数と静的変数が初期化される順序は指定されていません。foo()一般に、関数は他のいくつかの変数がすでに初期化されていることを合理的に期待できるため、呼び出しは特定の順序が必要であることを意味します。

IOW、Cでは、どちらのコードも。の前に実行されませんmain()

C ++にはそれを回避する方法がありますが、Cにはありません。

于 2012-10-04T04:58:51.440 に答える
5

すべての静的変数はコンパイル時であり、関数は実行時に出力を提供するため、コンパイル時変数を実行時変数で初期化することはできないため、エラーが発生します。

別の例は次のとおりです。

int main()
{
int p=9;
static int x=p;
}

上記のコードでもコンパイル時エラーが発生します。原因は上記と同じです。

于 2012-10-04T07:27:17.327 に答える
1

C ++ではなくCでこれを行う場合は、コンパイル中に使用可能な静的変数値のみを割り当てることができます。したがって、foo()の値は実行時まで決定されないため、foo()の使用は許可されていません。

于 2012-10-04T05:05:25.660 に答える