C 如何使用匿名结构声明变量

C 如何使用匿名结构声明变量,c,gcc,C,Gcc,下面的代码没有编译,我可以理解为什么,但我需要让它无论如何都能工作,最好是以符合标准的方式 extern const struct { int x; } a; const struct { int x; } a = {1}; 编译器说,“错误:a”的类型冲突,即使这些类型相同,即使它们可能是不同的匿名实例 那么,我如何向编译器解释这两种类型是相同的,而不给结构命名或使用typedef呢?可以这样做吗?两个struct声明声明了两种不同的类型 C标准非常明确。§6.7.2.3/p5:“结构、联

下面的代码没有编译,我可以理解为什么,但我需要让它无论如何都能工作,最好是以符合标准的方式

extern const struct {  int x; } a;

const struct { int x; } a = {1};
编译器说,“错误:a”的类型冲突,即使这些类型相同,即使它们可能是不同的匿名实例


那么,我如何向编译器解释这两种类型是相同的,而不给结构命名或使用typedef呢?可以这样做吗?

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

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

因此,在标准C中,你运气不好

如果您准备使用gcc扩展,则以下操作应该有效:

extern const struct {  int x; } a;

__typeof(a) a = {1};

如果您指定类似于
-std=gnu11
,那么您甚至可以省略两个下划线。

这是一个常量,您需要在声明中初始化它。如果不为true,您可以执行“extern const struct x1{int x;}b;const struct x1 b={1};”并且它可以工作,问题中的代码段不起作用,因为编译器确信这两个结构是不同的。具有相同结构的类型不是相同的类型。有没有办法让编译器接受这两个结构作为相同的类型?我不认为很难检测到这一点,问题是,标准是否要求这种行为?还是仅仅是一个编译器阴谋?如果是前者,我会接受,如果是后者,我会唠叨和抱怨。谢谢你,你有没有机会知道标准是否也禁止定义同一个结构两次,例如“struct a{int b;};struct a{int b;};”?@Martin。恐怕是这样。“特定类型的内容最多只能定义一次”。同一节,第1段。