在 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 以来它是合法的,因为它是一个 auto
matic 变量。但是,对于全局变量和 static
变量,这是不合法的。 gcc 还允许将此作为 C99 之前的扩展(当然,仍然 auto
)。
我通常建议至少使用与 C99 兼容的编译器,因为与早期标准存在一些细微差别,并且 C99 引入了许多有用的功能,例如 C++ 行注释、_Bool
等
注意:p
在运行时初始化,每次调用函数时(main
通常只调用一次,但规则也适用于此)。不管你能不能做到const
。一般来说,对于 const
变量(原文如此!),最好也有它们 static
或全局变量以节省 运行 时间开销。 OTOH,这(见上文)不允许使用变量初始值设定项。
像这样的初始化器是 C99 的一个特性。我不知道夹板,但夹板手册停留在 2003 年——这意味着夹板很有可能只是不会说 C99。
以下代码似乎可以正常编译。
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 以来它是合法的,因为它是一个 auto
matic 变量。但是,对于全局变量和 static
变量,这是不合法的。 gcc 还允许将此作为 C99 之前的扩展(当然,仍然 auto
)。
我通常建议至少使用与 C99 兼容的编译器,因为与早期标准存在一些细微差别,并且 C99 引入了许多有用的功能,例如 C++ 行注释、_Bool
等
注意:p
在运行时初始化,每次调用函数时(main
通常只调用一次,但规则也适用于此)。不管你能不能做到const
。一般来说,对于 const
变量(原文如此!),最好也有它们 static
或全局变量以节省 运行 时间开销。 OTOH,这(见上文)不允许使用变量初始值设定项。
像这样的初始化器是 C99 的一个特性。我不知道夹板,但夹板手册停留在 2003 年——这意味着夹板很有可能只是不会说 C99。