例如,此代码来自USB设备的固件:
typedef union HID_CONTROLS_TYPEDEF
{
struct
{
BYTE B1:1; //buttons
BYTE B2:1;
BYTE B3:1;
BYTE B4:1;
BYTE B5:1;
BYTE B6:1;
BYTE Bpad:2; //filler
} buttons;
} HID_CONTROLS;
为什么结构内部的结构,这会产生什么影响?不管它只是一个结构吗?
答案 0 :(得分:4)
在这种情况下,你是对的,它是'多余的。
然而,在过去的某个时间,联盟可能还带有一个8位字符,以便于映射。
或者也许他们认为将来会这样。
这是我的猜测,我强调,这只是猜测。然而,这只是其背后的原因,而且是一个相当受过良好教育的人。
struct
的超级(?)是给定的,而不是猜测。
答案 1 :(得分:2)
如果结构被带到联合之外,则意味着相同。我唯一能想到的是它强制代码包含buttons
。比如你写:
controls.buttons.B1 = ...;
而不是
controls.B1 = ...;
所以也许作者觉得这是自我记录的。
答案 2 :(得分:1)
是的,它会的。我猜这个联合最初写的是为了将数据作为一个整个字节来处理,因此填充它将它填充到8位。在低级嵌入式中这种情况并不少见。
发现没有必要访问整个字节,但工会刚刚离开,因为没有理由把它拿出来。
代码惯性。
答案 3 :(得分:1)
是的,应该,除非我遗漏了什么。我看到这个代码有两个可能的原因:一个是过去,另一个是未来; - )。
可能曾经有一个int作为联盟中结构的替代品;或者可能计划在未来添加一个。两者都会使包围它的联合变得合理,因为预期或过去的更改不会使用户代码更改成为必要。