0

以下の例では、コンパイル時にエラーが発生します

int main() {

    int x = 10; // guess this is runtime initialisation
    static int y = x; //guess this is loadtime initialisation

    printf("x = %d, y = %d", x, y);

}

エラー:

    error: initializer element is not constant

私の理解では、これは静的およびグローバルメンバーが自動変数に対して初期化される方法に関連しています。ロード時間、ランタイム、コンパイル時の初期化の違いを知りたかったのですが、要素の値がデータセクションとスタックに格納されることと、初期化への影響についても知りたかったのです。

4

3 に答える 3

0

C では、コンパイル時とロード時に違いはありません。同じことは C++ には当てはまりません。POD 定数はコンパイル時に初期化されますが、コンストラクターを持つグローバル/静的オブジェクトはロード時に初期化されます。

あなたの例では、コンパイル時の値を実行時の変数の内容で初期化しようとするため、失敗します。C++ では、xが宣言されている場合const、コンパイル時の定数として認識され、成功します。

于 2013-04-17T11:56:29.697 に答える
0

静的変数は、自動変数またはローカル変数の前に誕生したため、静的変数の初期化に変数を使用することはできません。静的変数の初期化には定数のみを使用できます。

ロード時の初期化とコンパイル時の初期化はCで同じであり、ランタイムの初期化はCでサポートされていない可能性があります..C ++でサポートされていますが、Cについては知りません

于 2013-04-17T11:57:01.410 に答える
0

定数はコンパイル時に初期化されますが、グローバル/静的変数はロード時に初期化されるため、x を const(c++) に変換できる場合、実行時のスタック変数を使用してロード時にグローバル/静的変数を初期化することはできません。正常に実行されます。

于 2013-04-17T12:22:08.017 に答える