7

gccでデフォルトのCを使用しています。

私のコード:

typedef struct _OpcodeEntry OpcodeEntry;

//

struct _OpcodeEntry
{
    unsigned char uOpcode;
    OpcodeMetadata pMetadata;
};

//

const OpcodeMetadata omCopyBytes1 = { 1, 1, 0, 0, 0, 0, &CopyBytes };

const OpcodeEntry pOpcodeTable[] =
{
    { 0x0, omCopyBytes1 },
};

エラー:

error: initializer element is not constant
error: (near initialization for 'pOpcodeTable[0].pMetadata')

omCopyBytes1上記の行で実際に設定されているものに変更すると、コードは正常にコンパイルされます。私は何が間違っているのですか?

4

2 に答える 2

7

はコンパイル時定数ではなく実行時定数である変数であるため、配列omCopyBytes1のメンバーを初期化するために使用することはできません。Cの集計初期化子はコンパイル時定数である必要があります。そのため、投稿のコードはコンパイルされません。pOpcodeTable[]omCopyBytes1

変数として、omCopyBytes1はメモリ内に独自の場所を持ち、アイテムの配列に初期化されます。このような変数は、次のようにポインタで使用できます。

struct _OpcodeEntry {
    unsigned char uOpcode;
    const OpcodeMetadata *pMetadata;
};
...
const OpcodeEntry pOpcodeTable[] = {
    { 0x0, &omCopyBytes1 }, // This should work
};

または、プリプロセッサ定数にすることもできます。

#define omCopyBytes1 { 1, 1, 0, 0, 0, 0, &CopyBytes }

このように定義された場合、omCopyBytes1は変数ではなくなります。コンパイラーが完了する前に消えるプリプロセッサー定義になります。プリプロセッサ方式はお勧めしませんが、やらなければならない場合に備えてあります。

于 2013-03-26T01:23:45.023 に答える
0

Cでは、静的ストレージ期間のオブジェクトの初期化子は定数式である必要があります。const修飾変数は定数式ではありません。

于 2013-03-26T01:23:02.527 に答える