为什么结构不能直接分配?

时间:2012-08-30 03:34:17

标签: c structure

假设我有一个带有标记MyStruct的完全定义的结构,并假设x, y, ..., z是其字段的允许值。为什么

struct MyStruct q = {x,y,..,z};

允许,但

struct MyStruct q;
q = {x,y,...,z};

是不允许的?我觉得这很烦人。在第二种情况下,我之前已经声明q,我需要逐个为每个字段分配一个值:

q.X = x; q.Y = y; ... q.Z = z;

其中X, Y, ..., ZMyStruct的字段。这背后有原因吗?

2 个答案:

答案 0 :(得分:34)

您正在寻找的是复合文字。这已添加到C99中的语言中。

你的第一个案例:

struct MyStruct q = {x,y,..,z};

是特定于初始化的语法。你的第二种情况,在语言的迂腐中,不是初始化,而是分配。赋值的右侧必须是正确类型的结构。在C99之前,语言中没有语法来编写结构文字,这正是您要做的。 {x,y,..,z}看起来像一个带有表达式的块。如果一个人受到启发,试图将其视为字面值,尽管语言没有,但人们无法确定它的类型。 (在你的背景下,你可以做出很好的猜测。)

为了允许这个并解决类型问题,C99添加了语法,因此您可以编写:

q = (struct MyStruct){x,y,...,z};

答案 1 :(得分:23)

您可以执行此操作,但需要在聚合之前提供结构类型:

struct MyStruct q;
q = (struct MyStruct){x,y,...,z};