C - 为什么在结合体中放置一个结构?

时间:2014-04-01 12:05:37

标签: c struct unions

例如,此代码来自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;

为什么结构内部的结构,这会产生什么影响?不管它只是一个结构吗?

4 个答案:

答案 0 :(得分:4)

在这种情况下,你是对的,它是'多余的。

然而,在过去的某个时间,联盟可能还带有一个8位字符,以便于映射。

或者也许他们认为将来会这样。

这是我的猜测,我强调,这只是猜测。然而,这只是其背后的原因,而且是一个相当受过良好教育的人。

struct的超级(?)是给定的,而不是猜测。

答案 1 :(得分:2)

如果结构被带到联合之外,则意味着相同。我唯一能想到的是它强制代码包含buttons。比如你写:

controls.buttons.B1 = ...;

而不是

controls.B1 = ...;

所以也许作者觉得这是自我记录的。

答案 2 :(得分:1)

是的,它会的。我猜这个联合最初写的是为了将数据作为一个整个字节来处理,因此填充它将它填充到8位。在低级嵌入式中这种情况并不少见。

发现没有必要访问整个字节,但工会刚刚离开,因为没有理由把它拿出来。

代码惯性。

答案 3 :(得分:1)

是的,应该,除非我遗漏了什么。我看到这个代码有两个可能的原因:一个是过去,另一个是未来; - )。

可能曾经有一个int作为联盟中结构的替代品;或者可能计划在未来添加一个。两者都会使包围它的联合变得合理,因为预期或过去的更改不会使用户代码更改成为必要。