Why structs cannot be assigned directly?

心不动则不痛 提交于 2019-11-29 16:26:14

问题


Suppose I have a fully defined struct with tag MyStruct, and suppose that x, y, ..., z are allowed values for its fields. Why is

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

allowed, but

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

is not allowed? I find this very annoying. In the second case, where I have previously declared q, I need to assign a value to each field, one by one:

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

where X, Y, ..., Z are the fields of MyStruct. Is there a reason behind this?


回答1:


What you are looking for is a compound literal. This was added to the language in C99.

Your first case:

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

is a syntax specific to initialization. Your second case, in the pedantics of the language is not initialization, but assignment. The right hand side of the assignment has to be a struct of the correct type. Prior to C99 there was no syntax in the language to write a struct literal, which is what you are trying to do. {x,y,..,z} looked like a block with an expression inside. If one were inspired to try to think of it as a literal value, though the language didn't, one couldn't be sure of its type. (In your context, you could make a good guess.)

To allow this and resolve the type issue, C99 added syntax so you could write:

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



回答2:


You can do this, but you need to supply the type of the structure before your aggregate:

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


来源:https://stackoverflow.com/questions/12189480/why-structs-cannot-be-assigned-directly

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!