在 C 的结构初始值设定项中使用变量是否合法?

Is it legal to use a variable in a struct initializer in C?

以下代码似乎可以正常编译。

typedef struct Test {
  int i;
  int j;
} Test;

int main() {
  int i;
  i = 0;
  Test p = {i, 1};
  printf("%d\n", p.i);
  return 0;
}

Splint 失败

example2.c:9:7: Parse Error. (For help on parse errors, see splint -help
           parseerrors.

(这是行Test p = {i, 1};

这是非法的 C,还是 splint 中的错误?

(我想这样做是因为我希望 p 为 const,尽管即使删除 const 修饰符似乎也会发生故障。如果我移动 [ 的声明和初始化=15=] 到一条线上,问题似乎也消失了。)

自 C99 以来它是合法的,因为它是一个 automatic 变量。但是,对于全局变量和 static 变量,这是不合法的。 gcc 还允许将此作为​​ C99 之前的扩展(当然,仍然 auto)。

我通常建议至少使用与 C99 兼容的编译器,因为与早期标准存在一些细微差别,并且 C99 引入了许多有用的功能,例如 C++ 行注释、_Bool

注意:p在运行时初始化,每次调用函数时(main通常只调用一次,但规则也适用于此)。不管你能不能做到const。一般来说,对于 const 变量(原文如此!),最好也有它们 static 或全局变量以节省 运行 时间开销。 OTOH,这(见上文)不允许使用变量初始值设定项。

像这样的初始化器是 C99 的一个特性。我不知道夹板,但夹板手册停留在 2003 年——这意味着夹板很有可能只是不会说 C99。