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来初始化pOpcodeTable[]数组的成员,因为omCopyBytes1它是一个运行时常量,而不是编译时常量。C 中的聚合初始值设定项必须是编译时常量,这就是您帖子中的代码无法编译的原因。

作为一个变量,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 }

如果以这种方式定义, theomCopyBytes1将不再是一个变量:它将是一个预处理器定义,在编译器完成之前就消失了。我建议不要使用预处理器方法,但如果你必须这样做,它就在那里。

于 2013-03-26T01:23:45.023 回答
0

在 C 中,静态存储持续时间的对象的初始值设定项必须是常量表达式。-const限定变量不是常量表达式。

于 2013-03-26T01:23:02.527 回答