C用现有的const变量初始化const struct成员

kva*_*nck 7 c struct const

我在gcc下使用默认的C语言.

我的代码:

typedef struct _OpcodeEntry OpcodeEntry;
Run Code Online (Sandbox Code Playgroud)

//

struct _OpcodeEntry
{
    unsigned char uOpcode;
    OpcodeMetadata pMetadata;
};
Run Code Online (Sandbox Code Playgroud)

//

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

const OpcodeEntry pOpcodeTable[] =
{
    { 0x0, omCopyBytes1 },
};
Run Code Online (Sandbox Code Playgroud)

错误:

error: initializer element is not constant
error: (near initialization for 'pOpcodeTable[0].pMetadata')
Run Code Online (Sandbox Code Playgroud)

如果我更改omCopyBytes1为上面一行中实际设置的内容,则代码编译正常.我究竟做错了什么?

das*_*ght 6

您不能用于omCopyBytes1初始化pOpcodeTable[]数组成员,因为它omCopyBytes1是一个运行时常量的变量,而不是编译时常量.C中的聚合初始值设定项必须是编译时常量,这就是你的帖子中的代码无法编译的原因.

作为变量,omCopyBytes1它在内存中有自己的位置,它被初始化为一个项目数组.您可以通过指针使用此类变量,如下所示:

struct _OpcodeEntry {
    unsigned char uOpcode;
    const OpcodeMetadata *pMetadata;
};
...
const OpcodeEntry pOpcodeTable[] = {
    { 0x0, &omCopyBytes1 }, // This should work
};
Run Code Online (Sandbox Code Playgroud)

或者,您可以使其成为预处理器常量:

#define omCopyBytes1 { 1, 1, 0, 0, 0, 0, &CopyBytes }
Run Code Online (Sandbox Code Playgroud)

如果以这种方式定义,则omCopyBytes1不再是变量:它将是在编译器完成之前消失的预处理器定义.我建议不要使用预处理器方法,但是如果你必须这样做的话.