【问题标题】:C Struct inside union inside structC 结构内部联合内部结构
【发布时间】:2012-04-26 15:01:07
【问题描述】:

如何初始化结构 B 或 C 的变量?

typedef struct _A
{
  union
  {
    struct
    {
      int b;
    } B;
    struct
    {
      int c;
    } C;
  } u;
} A;

类似的东西 A.u.B *bVar; 不起作用

【问题讨论】:

    标签: c struct unions


    【解决方案1】:

    typedef 仅涵盖 A,不包括其中定义的联合或结构。

    typedef 不能这样嵌套 - 每个用户定义的“类型”必须有一个标签,因此声明 A.u.B 类型的变量是非法的。

    【讨论】:

      【解决方案2】:

      应该这样做:

      /* Initialise to zero */
      A a = {{{0},{0}}};
      /* Now set the b to 5 */
      a.u.B.b = 5;
      

      如果你仔细观察大括号,你会发现它们与类型声明中的括号完全匹配。所以第一个大括号开始A,第二个开始A.u,第三个开始A.u.B,第一个0对应A.u.B.b。右大括号结束A.u.B,然后逗号表示下一个左大括号开始A.u.C,因此第二个零初始化A.u.C.c,然后所有大括号再次关闭。

      注意,并非所有编译器都支持匿名结构。我不记得他们是否被标准允许......

      【讨论】:

      • 所以我不能初始化为A.u.B b = 5 ??
      • @Nitrate 不,因为(根据我的回答)没有 A.u.B 这样的类型。你必须声明一个A 类型的变量,然后设置它的内容。
      • @Alnitak 是正确的,它不是真正的 'A.u.B' 我刚刚使用该符号来解释大括号如何初始化。
      【解决方案3】:

      你应该把你的结构声明在一边。

      typedef struct {
          int b;
      } B;
      

      【讨论】:

      • 您的意思是分别声明 B 和 C 并将它们包含在 A 中的联合中,为 typedef struct _A { union { struct B b; struct C c;} u; } A;
      • 是的。那么就可以使用这个类型了。
      • @Nitrate 但请注意,如果您声明独立的B,它将不会自动成为封闭A 的一部分。
      • @Alnitak 是的,我明白了
      • @Nitrate 如果你已经有typedef BC 那么你的A 只是typedef struct { union { B b; C c; } u; } A; - 没有必要使用struct 来引用B 和@987654331 @ 更多。
      猜你喜欢
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-12
      • 2022-08-15
      • 2011-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多