4

下面的代码似乎编译得很好。

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;
}

夹板失败

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

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

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

(我想这样做是因为我希望 p 成为const,尽管即使删除const修饰符似乎也会发生故障。如果我将声明和初始化i移到一行,问题似乎也消失了。)

4

2 回答 2

2

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

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

注意:p在运行时和每次调用函数时初始化(main通常只调用一次,但这里也适用该规则)。不管你成功const与否。一般来说,对于const变量(原文如此!),最好同时拥有它们static或全局变量以节省运行时开销。OTOH,这(见上文)不允许变量初始化器。

于 2015-07-11T18:11:41.337 回答
1

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

于 2015-07-11T18:11:56.620 回答