C初始化元素不是常量

时间:2017-11-15 14:27:21

标签: c compiler-errors constants

我收到了“错误:初始化元素不是常量” 使用此代码:

typedef struct {
    const int x;
    const int y;
} my_struct;

const int a = 8;
const int b = 12;

my_struct test = { a, b };

知道发生了什么以及如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

除了macros(它们有downsides)之外,未命名的枚举通常用于提供编译时常量。这会改变你的代码。

typedef struct {
    const int x;
    const int y;
} my_struct;

enum {
    a = 8,
    b = 12, 
};

my_struct test = { a, b };

...还涉及编译时常量的表达式本身就是编译时常量......

my_struct test1 = { a+1, b };
my_struct test2 = { a, 'H' };

sizeof运算符也可以生成编译时常量:

my_struct test3 = { sizeof(my_struct), b };

即使此示例看起来不太有用,it compiles

要了解究竟是什么常量表达式,请参阅例如Constant expressions - 尽管有URL(cppreference.com),但这是 C引用部分。

答案 1 :(得分:-1)

None中,使用C修饰符不会产生编译时常量值。

然后,根据初始化规则,const,章节§6.7.9

  

具有静态或线程存储持续时间的对象的初始值设定项中的所有表达式   应该是常量表达式或字符串文字。

你需要一个常量表达式(编译时constat)。

您可以使用C11 MACRO来获得所需的结果。类似的事情(警告:未经过测试的代码)

#define