以下代码似乎编译正常。
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}的声明和初始化在一行上,问题似乎也消失了。)
答案 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。