【问题标题】:What does it mean by putting a union inside a struct in c?将联合放在 c 中的结构中是什么意思?
【发布时间】:2013-04-11 05:50:45
【问题描述】:

我在看一些c代码,发现有些struct包含union name,没有变量名,就像下面的例子:

typedef union Lock Lock;

union Lock{
    uint32 key;
};

struct Test{
    Lock;
    uint32 name1;
};

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

【问题讨论】:

  • 那不是有效的 C。它不会按原样编译。
  • 此代码无法编译,因为声明缺少终止分号,uint32 未定义,Lock; 不是有效声明。您应该显示self-contained, compilable example 并指定您正在使用的编译器和开关。
  • @hyde 是的,有一个 typedef union Lock 锁。抱歉,这是我第一次尝试在这里发帖。我将在未来处理格式。谢谢。

标签: c struct unions


【解决方案1】:

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

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


有人猜测在结构的开头添加union LockLock 会起到一些作用。快速检查应该证明这是错误的:

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

【讨论】:

  • 现在如果结构中有union Lock 声明,它仍然是不完整的类型吗?我问是因为站点中已经有定义吗?
  • @Koushik 它不会做任何事情。类型不能不完整,因为上面有一个完整的声明。
  • 是的,所以结构内部的union Lock 是不完整的类型,并且不同于在结构外部以相同名称声明和定义的类型?
  • 这两个声明来自一个头文件。我猜可能就像 cnicutar 说的 struct Test 里面的 Lock 和 Union Lock 没有关系。但我不确定..
  • @user2268908 有没有可能Lock 实际上是一些扩展宏?
【解决方案2】:

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

struct Test{
    int Lock;
    uint32 name1;
}

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

【讨论】:

  • 这似乎有道理。我会查一下。谢谢。
【解决方案3】:

因此,添加 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 的一次令人困惑的尝试。

【讨论】:

    猜你喜欢
    • 2020-05-14
    • 2020-07-17
    • 2022-11-02
    • 2014-08-27
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 2014-09-01
    • 1970-01-01
    相关资源
    最近更新 更多