29

假设我有一个带有 tag 的完全定义的结构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, ..., Z的字段在哪里MyStruct。这背后有什么原因吗?

4

2 回答 2

43

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

你的第一个案例:

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

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

为了实现这一点并解决类型问题,C99 添加了语法,因此您可以编写:

q = (struct MyStruct){x,y,...,z};
于 2012-08-30T04:06:29.130 回答
25

您可以这样做,但您需要在聚合之前提供结构的类型:

struct MyStruct q;
q = (struct MyStruct){x,y,...,z};
于 2012-08-30T03:46:49.853 回答