【问题标题】:how to declare a variable using an anonymous struct如何使用匿名结构声明变量
【发布时间】:2015-01-11 06:02:21
【问题描述】:

以下代码无法编译,我可以理解原因,但无论如何我都需要让它工作,最好以符合标准的方式。

extern const struct {  int x; } a;

const struct { int x; } a = {1};

编译器说,“错误:‘a’的类型冲突”,即使类型相同,即使它们可能是不同的匿名实例。

那么,如何在不给结构命名或不使用 typedef 的情况下向编译器解释这两种类型是相同的?能做到吗?

【问题讨论】:

  • 是一个常量,需要在声明时初始化
  • 不是真的,你可以做“extern const struct x1 { int x; } b;const struct x1 b = {1};”并且它有效,问题中的 sn-p 不起作用,因为编译器确信这两个结构是不同的。
  • 类型结构相同但类型不同。
  • 有没有办法让编译器接受两者为同一类型?
  • 我不认为很难检测到这一点,问题是,这种行为是标准要求的吗?还是只是编译器的阴谋?如果是前者,我会接受,如果是后者,我会唠叨抱怨。

标签: c gcc


【解决方案1】:

两个struct 声明声明了两种不同的类型。

C 标准非常明确。 §6.7.2.3/p5:“结构、联合或 不包含标签的枚举类型声明了一个不同的类型。”

所以在标准 C 中,你运气不好。

如果您准备使用 gcc 扩展,以下应该可以工作:

extern const struct {  int x; } a;

__typeof(a) a = {1};

如果您指定-std=gnu11 之类的内容,您甚至可以省略两个下划线。

【讨论】:

  • 谢谢你,你有没有机会知道标准是否也禁止定义相同的结构两次,例如“结构一个{int b;};结构一个{int b;};” ?
  • @Martin。恐怕是这样。 “一个特定类型的内容最多只能定义一次”。同一节,第 1 段。
猜你喜欢
  • 2013-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-23
  • 2016-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多