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

以下代码不会编译:

const int a = 0; struct Test { int b; }; static const struct Test test = { a }; 

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

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

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

 #define a 0 

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

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