在结构内部的匿名联合与命名联合类型?

时间:2019-01-06 23:37:54

标签: c struct unions

在阅读the documentation of BLUETOOTH_ADDRESS structure时,我遇到了以下代码:

typedef struct _BLUETOOTH_ADDRESS {
  union {
    BTH_ADDR ullLong;
    BYTE     rgBytes[6];
  };
} BLUETOOTH_ADDRESS_STRUCT;

这让我感到奇怪;如果我们定义一个唯一成员为(匿名)联合的结构,那么该结构与创建命名联合类型有什么区别?

union BLUETOOTH_ADDRESS_STRUCT {
    BTH_ADDR ullLong;
    BYTE     rgBytes[6];
};

看起来这两个是相同的,所以我想我缺少了一些东西。为什么要使用前者而不是后者?

2 个答案:

答案 0 :(得分:2)

@Swordfish描述了有关代码的未来维护和开发的重要区别。但是,即使我们仅考虑这两种选择的语义,在联合与仅成员是匿名联合的结构之间也存在一些不等式。其中一些是区别,没有任何实际差异。

  • 从该标准的意义上讲,这两种类型不是“兼容的”,这大致意味着您不能在需要另一种对象的情况下使用其中一种类型的对象。

  • 带标签的联合可以具有带有灵活数组成员的成员结构。结构内部的匿名联合可能没有这样的成员(C2011,6.7.2.1/3)。

  • 您可以将offsetof宏(C2011,7.19/3)与匿名联合的结构和成员一起使用,但不能与已标记的联合一起使用。

  • 尽管标准要求指向结构类型的指针具有彼此相同的表示,并且要求指向联合类型的指针具有彼此相同的表示,但不需要指向结构的指针与表示并集的指针具有相同的表示形式(C2011,6.2.5/28)。

  • 有一个特殊的规定,用于访问属于同一联合的成员的结构的公共初始序列(c2011,6.5.2.3/6)。它不适用于作为工会成员的工会。

答案 1 :(得分:1)

我想到使用包含匿名struct而不是union的{​​{1}}的一个可能原因是,可以将其他成员添加到union在将来。用struct不可能做到这一点。