在c中,将联合放在结构中意味着什么?

在c中,将联合放在结构中意味着什么?,c,struct,unions,C,Struct,Unions,我正在阅读一些c代码,发现一些结构包含一个没有变量名的联合名,如下例所示: typedef union Lock Lock; union Lock{ uint32 key; }; struct Test{ Lock; uint32 name1; }; 锁内测试是什么意思? 注:类型uint32在两个声明之前已经定义。您发布的内容是无效的C。就语言而言,Lock和union Lock是完全不同的东西,仅此而已 然而,如果你在结构中说联合锁,它会编译,但不会做任何事情:

我正在阅读一些c代码,发现一些结构包含一个没有变量名的联合名,如下例所示:

typedef union Lock Lock;

union Lock{
    uint32 key;
};

struct Test{
    Lock;
    uint32 name1;
};
锁内测试是什么意思?
注:类型uint32在两个声明之前已经定义。

您发布的内容是无效的C。就语言而言,
Lock
union Lock
是完全不同的东西,仅此而已

然而,如果你在结构中说
联合锁
,它会编译,但不会做任何事情:它只是一个多余的声明,什么也不声明


有人推测,在结构的开头添加一个
联合锁
。快速检查应证明错误:

printf("%zu\n", offsetof(struct Test, name1)); /* Will print 0. */

如果你能编译你的代码,我猜你正在使用一个旧的编译器或者一个仍然支持隐式int的编译器。这意味着编译器将你的代码解释为

struct Test{
    int Lock;
    uint32 name1;
}

另请参见

因此,添加typedef后,gcc会产生警告:

main.c:8:9: warning: declaration does not declare anything [enabled by default]
此外,simple
sizeof
显示它们具有相同的大小:

struct Test{
    Lock;
    uint32 name1;
};

struct Test2{
    uint32 name1;
};

我不认为在C语言中有任何场景,这意味着任何有用的东西。可能这是一次混乱的尝试。

这不是有效的C。它不会按原样编译。此代码不会编译,因为声明缺少终止分号,
uint32
未定义,并且
Lock不是有效的声明。您应该显示并指定正在使用的编译器和开关。@hyde是的,有一个typedef联合锁。很抱歉,这是我第一次尝试在这里发布。我将在将来处理格式。谢谢。现在,如果结构中有一个
联合锁
声明,它还会是不完整的类型吗?我这么问是因为站点中已经有了定义?@Koushik它不会做任何事情。类型不能是不完整的,因为上面有一个完整的声明。是的,因此结构内部的
联合锁
是不完整的类型,不同于在结构外部以相同名称声明和定义的类型?这两个声明来自头文件。我猜这可能就像cnicutar所说的,结构测试中的锁与联合锁无关。但我不确定..@user2268908是否可能
Lock
实际上是某个扩展宏?这似乎有道理。我会检查的。谢谢