【问题标题】:compile error C2099: initializer is not a constant [duplicate]编译错误 C2099:初始化程序不是常量 [重复]
【发布时间】:2011-09-02 03:40:28
【问题描述】:

以下代码无法编译:

const int a = 0;

struct Test
{
    int b;
};

static const struct Test test = 
{
    a
};

这是我真正想做的事情的简化示例,但我做错了什么?

【问题讨论】:

  • 您是否尝试在单独的项目中编译它?对我来说看起来很完美。

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


【解决方案1】:

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

在 C99 中,对聚合初始值设定项的要求有所放宽。现在可以在本地对象的聚合初始值设定项中使用非常量。但是,对于静态对象(如您的示例),该要求仍然成立。因此,即使在 C99 中,您也必须使用

#define a 0

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

【讨论】:

  • +1,比我的回答更完整,即使在几点上略有偏差。您可能希望使用短语“constant expression”而不是“constants”,因为前者在 C 语言中有官方定义,并明确表示复杂表达式只要其组成组件“足够”即可满足要求常数”。
【解决方案2】:

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

【讨论】:

  • 请注意 - 这在 C++ 中有所不同,它允许您在其他常量表达式中使用由常量表达式初始化的 const 限定整数变量。
  • 注明。在 Java 和 C# 中它也不同吗? Python 怎么样?还是口齿不清? ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-14
  • 2011-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-02
相关资源
最近更新 更多