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

bec*_*cko 22 c structure

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

struct MyStruct q = {x,y,..,z};
Run Code Online (Sandbox Code Playgroud)

允许,但是

struct MyStruct q;
q = {x,y,...,z};
Run Code Online (Sandbox Code Playgroud)

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

q.X = x; q.Y = y; ... q.Z = z;
Run Code Online (Sandbox Code Playgroud)

在哪里X, Y, ..., Z的领域MyStruct.这背后有原因吗?

Avi*_*ger 36

你在寻找的是复合文字.这已被添加到C99中的语言中.

你的第一个案例:

struct MyStruct q = {x,y,..,z};
Run Code Online (Sandbox Code Playgroud)

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

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

q = (struct MyStruct){x,y,...,z};
Run Code Online (Sandbox Code Playgroud)

  • +1表示它是C99.不知道这可能是因为我们必须使用旧的编译器. (4认同)

das*_*ght 23

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

struct MyStruct q;
q = (struct MyStruct){x,y,...,z};
Run Code Online (Sandbox Code Playgroud)

  • 但仅限于C99(参见Avi Berger的回答) (2认同)
  • @becko:你的期望太高了...... MS工具很少使用最新标准. (2认同)