【问题标题】:Why structs cannot be assigned directly?为什么不能直接分配结构?
【发布时间】:2012-08-24 17:52:36
【问题描述】:

假设我有一个带有标签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 的字段。这背后有什么原因吗?

【问题讨论】:

  • 赋值的右值不是具体的,它在运行时。然而,初始分配是具体的,并且可以在二进制文件中使用(如果这是一个 elf 文件,最有可能在 .BSS 部分中)。如果要相互分配结构,可以将 q 分配给初始化的东西。喜欢;结构 MyStruct w = {x,y,..,z}; q = w

标签: c structure


【解决方案1】:

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

你的第一个案例:

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

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

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

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

【讨论】:

  • +1 用于指定它是 C99。不知道这是可能的,这可能是因为我们必须使用旧的编译器。
【解决方案2】:

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

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

【讨论】:

  • 但仅在 C99 中(参见 Avi Berger 的回答)
  • @AAT 你是对的,这是 C99 中添加的功能。然而,由于 C99 已经存在了十多年,它在许多情况下几乎已成为 C 的代名词。
  • @AAT 它不起作用。我正在使用 Visual Studio 2010,Windows。我得到一个语法错误,它不会编译。我希望 Visual Studio 能够支持最新的标准。我一定是在某处遗漏了某个设置,或者其他什么。有任何想法吗?或许我应该针对这个问题提出一个新问题?
  • @becko:你的期望太高了...... MS 工具很少使用最新标准。
  • 该死的......你是对的。我刚发现这个:stackoverflow.com/q/146381/855050。谷歌搜索了一下,似乎 MS 没有计划支持 C99 或 C11。
猜你喜欢
  • 2023-03-25
  • 1970-01-01
  • 2014-01-09
  • 1970-01-01
  • 2015-01-26
  • 2010-12-25
  • 1970-01-01
  • 2013-08-05
  • 2021-09-25
相关资源
最近更新 更多