"初始化元素不是常量",在C99的静态结构上使用指定的初始值设定项

Dil*_*ill 1 c c99

有人可以解释这种行为吗?

使用编译器标志std=c99我得到以下错误:

  • 对于b1,"初始化元素不是常数".
  • "预期表达''.' 令牌"为b2
  • b3没关系.

什么时候不使用-std=c99所有行都行.当不使用静态b1是好的.我正在使用GCC.

typedef struct A_tag {
    int v;
    int w;
} A;

typedef struct B_tag {
    A super;
    int x;
    int y;
} B;

void test(){
static B b1 = ((B){.super={.v=100}, .x=10});
static B b2 = ({.super={.v=100}, .x=10});
static B b3 = {.super={.v=100}, .x=10};
}
Run Code Online (Sandbox Code Playgroud)

Jen*_*edt 7

(B){.super={.v=100}, .x=10}不是"演员",但作为一个整体,这是一个"复合文字",只是一个临时对象,只存在于相应的表达式中(基本上).由于这不是一个常量而是一个临时对象,按照标准你不能用它初始化.