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

C 为什么不能直接分配结构?,c,structure,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,…,Z是MyStruct的字段。这背后有什么原因吗?您可以这样做,但需要在聚合之前提供

假设我有一个完全定义的结构,带有标记
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
的字段。这背后有什么原因吗?

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

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

你要找的是复合文字。这已添加到C99中的语言中

您的第一个案例:

struct MyStruct q = {x,y,..,z};
是特定于初始化的语法。第二种情况,在语言的学究中,不是初始化,而是赋值。赋值的右侧必须是正确类型的结构。在C99之前,该语言中没有用于编写结构文本的语法,而这正是您要做的。{x,y,…,z}看起来像一个内部有表达式的块。如果一个人受到启发,试图将其视为一个字面值,尽管该语言没有,但他无法确定其类型。(在您的上下文中,您可以做出很好的猜测。)

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

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

赋值的右值不是具体的,它在运行时。但是,初始赋值是具体的,并且是二进制的(如果是elf文件,则最有可能在.BSS节中)。如果要将结构相互分配,可以将q分配给初始化的对象。喜欢结构MyStruct w={x,y,…,z};q=w+1用于指定它是C99。我不知道这是可能的,这可能是因为我们必须使用旧的编译器。但只有在C99中(参见Avi Berger的回答)@AAT您是正确的,这是C99中添加的一项功能。然而,由于C99已经存在了十多年,它在许多情况下几乎成为C的同义词。@AAT它不起作用。我正在使用VisualStudio2010,Windows。我得到一个语法错误,它无法编译。我希望VisualStudio支持最新的标准。我一定是错过了某个场景,或者什么的。有什么想法吗?也许我应该就这个问题提出一个新问题?@becko:你的期望太高了。。。MS工具很少使用最新标准。该死。。。你说得对。我刚找到这个:。在谷歌搜索了一下之后,微软似乎没有计划支持C99和C11。