为什么不允许这种类型的C99结构初始化?如果(不)可能,请解释。
struct Point {int x; int y;};
struct Data {struct Point p;};
struct Data data = {};
data.p = {.x = 2, .y = 4};
但是,这是允许的:
struct Point {int x; int y;};
struct Data {struct Point p;};
struct Data data = {};
struct Point p = {.x = 2, .y = 4};
data.p = p;
1条答案
按热度按时间rxztt3cl1#
严格符合C中不允许有任何代码样本;语法要求在花括号内至少有一个初始化器,因此
struct Data data = {}
;不正确。(可更正为struct Data data;
或struct Data data = {0};
。)data.p = {.x = 2, .y = 4};
是赋值,不是初始化。在标准C语法中,赋值的右操作数必须是表达式(特别是 assignment-expression)。源代码{.x = 2, .y = 4}
不是表达式;不存在以{
开头的表达式。源代码p
是表达式,因此它可以是赋值的右操作数。可以使用
data.p = (struct Point) {.x = 2, .y = 4};
,其中(struct Point) {.x = 2, .y = 4}
是一个复合文字,它确实构成了一个表达式。