我在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
更改为上面一行中实际设置的值,则代码编译正常。我做错了什么?
答案 0 :(得分:5)
您无法使用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 }
如果以这种方式定义,omCopyBytes1
将不再是变量:它将是在编译器完成之前消失的预处理器定义。我建议不要使用预处理器方法,但是如果你必须这样做的话。
答案 1 :(得分:0)
在C中,静态存储持续时间对象的初始值设定项必须是常量表达式。 const
- 限定变量不是常量表达式。