ERROR
このプログラムを回線で実行しているときに取得します
static int b = a; //error : initializer element is not constant
理由がわかりませんか?
#include <stdio.h>
// #include <setjmp.h>
int main()
{
int a = 5;
static int b = a;
return 0;
}
ERROR
このプログラムを回線で実行しているときに取得します
static int b = a; //error : initializer element is not constant
理由がわかりませんか?
#include <stdio.h>
// #include <setjmp.h>
int main()
{
int a = 5;
static int b = a;
return 0;
}
ここにある他の回答に記載されている他の理由とは別に、規格の以下の記述を参照してください。
C標準はこれをポイント4(セクション6.7.8初期化)で述べています。
All the expressions in an initializer for an object that has static storage duration
shall be constant expressions or string literals.
さらに、定数式とは何かについては、セクション6.6定数式で次のように述べています。
A constant expression can be evaluated during translation rather than runtime, and
accordingly may be used in any place that a constant may be.
Cでは(C ++とは異なり)、静的ストレージ期間を持つオブジェクト(関数staticsを含む)の初期化子は定数式である必要があります。あなたの例a
では定数式ではないので、初期化は無効です。
C99 6.7.8 / 4:
静的な保存期間を持つオブジェクトの初期化子のすべての式は、定数式または文字列リテラルでなければなりません。
静的変数は、スレッドのスタック上にないという意味で常にグローバルであり、その宣言が関数内にあるかどうかは重要ではありません。
したがって、グローバル変数の初期化は、b
プログラムの起動中、関数(を含むmain
)が呼び出される前に実行されます。つまり、関数(ここ)が呼び出された後にスタックにメモリを配置するローカル変数であるa
ため、その時点では存在しません。 。a
main
したがって、コンパイラがそれを受け入れることを実際に期待することはできません。
アルスの答えに続いて...
// This is really crappy code but demonstrates the problem another way ....
#include <stdio.h>
int main(int argc, char *argv[])
{
static int b = argc ; // how can the compiler know
// what to assign at compile time?
return 0;
}