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

aCu*_*ria 10 c compiler-construction visual-studio-2010

以下代码不会编译:

const int a = 0;

struct Test
{
    int b;
};

static const struct Test test = 
{
    a
};
Run Code Online (Sandbox Code Playgroud)

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

AnT*_*AnT 17

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

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

#define a 0
Run Code Online (Sandbox Code Playgroud)

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


R..*_*R.. 6

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

  • 作为注释 - 这在C++中是不同的,它将允许您使用在其他常量表达式中使用常量表达式初始化的`const`限定的整数变量. (5认同)