在C中的struct初始化程序中使用变量是否合法?

时间:2015-07-11 18:06:46

标签: c initialization splint

以下代码似乎编译正常。

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,还是夹板中的错误?

(我想这样做是因为我希望p为const,尽管即使删除const修饰符也会发生失败。如果我移动{{1}的声明和初始化在一行上,问题似乎也消失了。)

2 个答案:

答案 0 :(得分:2)

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

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

注意:p在运行时初始化,每次调用函数时(main通常只调用一次,但规则也适用于此处)。无论你是否const。通常,对于const变量(sic!),最好还有它们static或全局来节省运行时开销。 OTOH,这个(见上文)不允许使用变量初始化器。

答案 1 :(得分:1)

像这样的初始化器是C99功能。我不知道夹板,但夹板手册在2003年被卡住了 - 这意味着夹板的可靠概率不会说C99。