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

在C中的结构初始值设定项中使用变量合法吗?,c,initialization,splint,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; } 夹板因断裂而失效 example2.c:9:7: Parse Error. (For help on parse errors, see splint -help parseer

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

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.
(这是一行
测试p={i,1};

这是非法的C,还是夹板上的虫子


(我之所以这样做是因为我希望p是
const
,尽管即使我删除
const
修饰符,失败似乎也会发生。如果我将
I
的声明和初始化移到一行,问题似乎也会消失。)

这是合法的,因为C99是一个
auto
变量。但是,对于全局变量和
静态变量来说,这是不合法的。gcc还允许将此作为C99之前版本的扩展(当然,仍然仅限于
auto

<>我一般建议至少使用C99兼容编译器,因为与早期标准有一些细微的差别,C99引入了许多有用的特性,如C++行注释、<代码>
注意:
p
在运行时初始化,每次调用函数时(
main
通常只调用一次,但规则也适用于此处)。无论您是否将其设置为常量。一般来说,对于
const
变量(sic!),最好同时使用
static
或global来节省运行时开销。OTOH,这(见上文)不允许使用变量初始值设定项。

像这样的初始值设定项是C99的特性。我不知道splint,但是splint手册在2003年就被卡住了——这意味着splint很有可能不说C99。

C99。
register
变量也是合法的。@fuzzxl:
register
意味着
auto
。实际上,p取决于用户输入,因此,我认为将其设置为
静态
(尽管正如您所说,它在主函数中没有任何区别)并不是说“对该函数的所有调用都是常量”,否则我可能会在函数之外声明它。我只是想防止它随后在函数中被意外修改。@GeorgeSimms:这更像是一个普通的加法。Rmember,可能还有其他用户在读这篇文章,并想知道为什么它不起作用(尽管之前已经给出了所有的谜题)。@Olaf OK。但我认为,在语义上,使用非静态常量仍然是合法的