将一个联合放在一个结构中的c是什么意思?

时间:2013-04-11 05:50:45

标签: c struct unions

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

typedef union Lock Lock;

union Lock{
    uint32 key;
};

struct Test{
    Lock;
    uint32 name1;
};

Lock inside Test是什么意思? PS。在两个声明之前已经定义了类型uint32。

3 个答案:

答案 0 :(得分:0)

您发布的内容无效C.就语言而言,Lockunion Lock完全不同,就是这样。

但是如果你在结构中说union Lock它会编译但不会做任何事情:它只是一个多余的声明,什么都不宣告。


有人猜测在结构的开头添加union LockLock会有所作为。快速检查应该证明是错误的:

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

答案 1 :(得分:0)

如果您可以编译代码,我猜您使用的是旧编译器或仍支持隐式int 的编译器。这意味着编译器会将您的代码解释为

struct Test{
    int Lock;
    uint32 name1;
}

另请参阅Why does/did C allow implicit function and typeless variable declarations?

答案 2 :(得分:0)

因此,添加了typedef后,gcc会发出警告:

main.c:8:9: warning: declaration does not declare anything [enabled by default]

此外,简单的sizeof表明它们具有相同的大小:

struct Test{
    Lock;
    uint32 name1;
};

struct Test2{
    uint32 name1;
};

我不认为在C中有任何情况,这可能意味着任何有用的东西。也许这是forward declaration的混乱尝试。