10

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

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: エラー: 初期化要素が定数ではありません

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

4

6 に答える 6

20

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

非定数定数の例として、宣言してもまったく問題ありません

 const volatile unsigned int milliseconds_since_boot;

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

于 2012-07-18T13:24:40.070 に答える
14

これは、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++ としてコンパイルすることもできます。

于 2012-07-18T12:16:52.207 に答える
6

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

#define X_ORIGIN (1233086)
#define Y_ORIGIN (-4728071)
#define Z_ORIGIN (4085704)
const int xyzOrigin[NUM_DIMENSIONS] = {X_ORIGIN, Y_ORIGIN, Z_ORIGIN};

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

于 2012-07-18T12:17:59.127 に答える
4

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

enum { X_ORIGIN = 1233086,
       Y_ORIGIN = -4728071,
       Z_ORIGIN = 4085704 };

const int xyzOrigin[] = { X_ORIGIN, Y_ORIGIN, Z_ORIGIN };

int main()
{
    return 0;
}
于 2012-07-18T12:27:00.147 に答える
2

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

読んだ後、あなたは知っている必要がありNUM_DIMENSIONSますconst。次に、この方法で配列を初期化することはできません。

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

const int xyzOrigin[NUM_DIMENSIONS] = {X_ORIGIN, Y_ORIGIN, Z_ORIGIN};

使用する必要があります:#define NUM_DIMENSIONS 3または、角括弧内に変数なしで宣言することもできますconst int xyzOrigin[] = {X_ORIGIN, Y_ORIGIN, Z_ORIGIN};

于 2012-07-18T13:11:56.763 に答える
0

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

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};
}
于 2012-07-18T12:19:54.213 に答える