c - 结构内的匿名联合与命名联合类型?
问题描述
在阅读BLUETOOTH_ADDRESS 结构的文档时,我遇到了以下代码:
typedef struct _BLUETOOTH_ADDRESS {
union {
BTH_ADDR ullLong;
BYTE rgBytes[6];
};
} BLUETOOTH_ADDRESS_STRUCT;
这让我想知道;如果我们定义一个结构,其唯一成员是(匿名)联合,那么这与创建命名联合类型有什么区别?
union BLUETOOTH_ADDRESS_STRUCT {
BTH_ADDR ullLong;
BYTE rgBytes[6];
};
看起来这两个是一样的,所以我想我错过了一些东西。为什么使用前者而不使用后者?
解决方案
@Swordfish 描述了与您的代码的未来维护和开发有关的重要区别。但是,即使我们只考虑这两种选择的语义,联合和唯一成员是匿名联合的结构之间也存在一些不等价。然而,其中一些是没有任何实际区别的区别。
这两种类型在该术语的标准意义上是不“兼容的”,这大致意味着您不能使用其中一种类型的对象,而需要另一种类型的对象。
标记的联合可以具有具有灵活数组成员的成员结构。结构内的匿名联合可能没有这样的成员(C2011,6.7.2.1/3)。
您可以将
offsetof
宏 (C2011, 7.19/3 ) 与结构及其匿名联合的成员一起使用,但不能与标记联合使用。尽管该标准要求指向结构类型的指针彼此具有相同的表示,并且要求指向联合类型的指针具有彼此相同的表示,但它并不要求指向结构的指针具有与指向联合的指针相同的表示( C2011,6.2.5 /28)。
对于访问属于同一联合的成员的结构的公共初始序列有一项特殊规定(c2011,6.5.2.3/ 6)。它不适用于作为工会成员的工会。
推荐阅读
- javascript - 使用 windows.prevFocus 设置新值
- rust - 推送 SelectAll 流
- oracle - 需要向oracle表中插入记录进行调度
- c++ - 正确的参数 char *[] 调用函数?
- c++ - 类不存储向量值
- sqlite - sqlite数据库的具体区别
- swiftui - SwiftUI TabView 亮度视图垂直位置
- javascript - 在 `ElementHandle.click()` 之后获取新页面的 Puppeteer 页面/框架句柄
- firebase - Fluuter Firebase 参数类型“对象?” 不能分配给参数类型“地图”
' - api - REST 流 API 是否使用 HTTP Keep-Alive 标头数据包实现?