20

私はjavascript/php / pythonから来ていますが、おそらく何かが足りません。コードは次のとおりです。

const int a = 50;
const int c = 100;
const int d = 100;
int endX = c + a;
int endY = d;
int startX, startY, b;

私は得る

ex1.4.c:6:エラー:初期化要素が一定ではありません
ex1.4.c:7:エラー:初期化要素が一定ではありません

誰か説明がありますか?

4

5 に答える 5

19

残念ながら、Cではconst変数は実際には定数ではありません。

以下は、c99標準からの抜粋です。

6.7.8初期化

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

定数は次のように定義されます。

6.4.4定数

構文

絶え間ない:

integer-constant       (e.g. 4, 42L)
floating-constant      (e.g. 0.345, .7)
enumeration-constant   (stuff in enums)
character-constant     (e.g. 'c', '\0')

この規格では、定数式を次のように定義しています。

6.6定数式

(7)初期化子の定数式には、より多くの許容範囲があります。このような定数式は、次のいずれかであるか、評価されます。

—算術定数式、

— nullポインタ定数、

—アドレス定数、または

—オブジェクトタイプのアドレス定数プラスまたはマイナス整数定数式。

(8)算術定数式は、算術型を持ち、 整数定数、浮動定数、列挙定数、文字定数、および式のサイズであるオペランドのみを持つものとします。算術定数式のキャスト演算子は、結果が整数定数であるsizeof演算子へのオペランドの一部を除いて、算術型を算術型に変換するだけです。

したがって、caは定数式ではなく、この場合は初期化子として使用できません。

于 2012-10-05T17:25:20.263 に答える
7

const式は、C ++とは異なり、Cではコンパイル時定数でなければならないためc+a、定数として使用することはできません。Cでこの問題を処理する通常の方法は、代わりにプリプロセッサを使用することです。

#define A 50
#define C 100
#define D 100
int endX = C + A;
int endY = D;
int startX, startY, b;
于 2012-10-05T17:40:10.653 に答える
5

endXをグローバル変数として宣言している場合、エラーは理にかなっています。

その理由は、グローバル変数がコンパイル時に初期化され、実行時に実行する必要のある操作としてendXを初期化しようとしているためです。

于 2012-10-05T17:04:42.587 に答える
3

ええ、何かを変数に初期化することはできません。コンパイラは初期化を行い、コンパイル時にc+a;の値を認識しません。

型の初期化は問題ありません。コンパイラは、オブジェクトコードのアドレスにをint x = 1;置くだけです。1x

何かをに初期化するには、実行時に、のスタートアップコードまたはのコンストラクターでc+aそれを実行します。cC++

于 2012-10-05T17:04:20.987 に答える
0

Cプログラミング言語では、静的ストレージ期間を持つオブジェクトは、定数式(または定数式を含む集合体)で初期化する必要があります。endX静的ストレージ期間がある場合、その初期化子(c+a)は定数式ではありません(つまり、式は変換フェーズ中に評価できません)。

于 2012-10-05T17:22:19.450 に答える