编译错误C2099:初始化程序不是常量

时间:2011-05-25 21:54:42

标签: c visual-studio-2010 compiler-construction

以下代码不会编译:

const int a = 0;

struct Test
{
    int b;
};

static const struct Test test = 
{
    a
};

这是我真正想要做的一个减少的例子,但我做错了什么?

2 个答案:

答案 0 :(得分:17)

在C语言的C89 / 90版本中,所有聚合初始值设定项必须仅包含常量。在C语言术语中,int类型的常量是一个字面值,如1020u0x1等。枚举成员也是常量。 const int类型的变量在C中是不是常量。您不能在聚合初始值设定项中使用const int变量。 (因此,在C语言中,当您需要声明一个命名常量时,您应该使用#defineenum,而不是const限定符。)

在C99中,放宽了对聚合初始化器的这一要求。现在可以在本地对象的聚合初始值设定项中使用非常量。但是,对于静态对象(如您的示例中),要求仍然存在。所以,即使在C99中,你也必须使用

#define a 0

或使用@R ..答案中建议的命名枚举常量。

答案 1 :(得分:6)

a不是常量表达式。这是一个const限定变量。如果您想要一个可以在常量表达式中使用的符号名称,则需要预处理器宏(#define a 0)或枚举(enum { a = 0 };)。