web-dev-qa-db-ja.com

イニシャライザが定数ではないというエラーが発生するのはなぜですか?

私は次のコードを使用しています。

const int X_Origin = 1233086;             
const int Y_Origin = -4728071;              
const int Z_Origin = 4085704;
const int xyzOrigin[NUM_DIMENSIONS] = {X_Origin, Y_Origin, Z_Origin};

コンパイルすると、GCCで次のエラーが発生します。

Transformations.h:16:1:エラー:初期化要素が一定ではありません

どういう意味ですか?コードを修正するにはどうすればよいですか?

10

これは、Cのグローバルスコープでは実行できません。ローカルスコープでのみ実行できます。つまり、関数内でのみ実行できます。

#define NUM_DIMENSIONS 3

const int X_Origin = 1233086;             
const int Y_Origin = -4728071;              
const int Z_Origin = 4085704;

const int xyzOrigin[NUM_DIMENSIONS] = {X_Origin, Y_Origin, Z_Origin}; // FAIL

void foo(void)
{
    const int xyzOrigin[NUM_DIMENSIONS] = {X_Origin, Y_Origin, Z_Origin}; // OK
}

または、コードをCではなくC++としてコンパイルすることもできます。

14
Paul R

多くの場合、キーワードconstの名前は誤解を招き、変更できない定数値を意味します。少なくともCでは、それは読み取り専用を意味します。ファイルスコープのconst修飾オブジェクトは、配列初期化子として機能するための適切な定数を持っていません。

一定でない定数の例として、宣言することは完全にOKです

 const volatile unsigned int milliseconds_since_boot;

コンパイラの制御外から更新され(HWレジスタを考えてください)、割り当てることが許可されていない値です。つまり、読み取り専用です。

20
Jens

私は適切なプログラマーではありません;)しかし、私はこれを行います:

#define X_Origin (1233086)
#define Y_Origin (-4728071)
#define Z_Origin (4085704)
const int xyzOrigin[NUM_DIMENSIONS] = {X_Origin, Y_Origin, Z_Origin};

そうすれば、それは単なるテキスト置換です。それでもコンパイラがダミーを吐き出す場合は、少なくとも問題がどこにあるかを知ることに一歩近づいています。

6
John U

別の方法として、これはこの場合にも機能します。

enum { X_Origin = 1233086,
       Y_Origin = -4728071,
       Z_Origin = 4085704 };

const int xyzOrigin[] = { X_Origin, Y_Origin, Z_Origin };

int main()
{
    return 0;
}
4
hmjd

C言語では、静的ストレージ期間を持つオブジェクトは、定数式または定数式を含む集約初期化子で初期化する必要があります。 -- AndreyTの回答

読んだ後、あなたはNUM_DIMENSIONSconst-修飾がある場合、定数ではありません!その場合、この方法でアレイを初期化することはできません。

このコードを使用するには:

const int xyzOrigin[NUM_DIMENSIONS] = {X_Origin, Y_Origin, Z_Origin};

使用する必要があります:#define NUM_DIMENSIONS 3または、角括弧内に変数を入れずに宣言することもできますconst int xyzOrigin[] = {X_Origin, Y_Origin, Z_Origin};

2
waldyr.ar

トリクロサンが言ったように:

main()
{
    const int X_Origin = 1233086;
    const int Y_Origin = -4728071;
    const int Z_Origin = 4085704;
    const int xyzOrigin[] = {X_Origin, Y_Origin, Z_Origin};
}

これはうまくいきます...

または、事前に寸法がわかっている場合は、次のようにします。

#define DIM 3

main()
{
    const int X_Origin = 1233086;
    const int Y_Origin = -4728071;
    const int Z_Origin = 4085704;
    const int xyzOrigin[DIM] = {X_Origin, Y_Origin, Z_Origin};
}
0
Bruno Oliveira