为什么不允许这种类型的C99结构初始化?

huus2vyu  于 2022-12-17  发布在  其他
关注(0)|答案(1)|浏览(126)

为什么不允许这种类型的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;
rxztt3cl

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}是一个复合文字,它确实构成了一个表达式。

相关问题