仅包含一个结构的联合

union containing only one struct

我今天开始在 PIC16f88 上编程,发现其寄存器的 header 包含一个 union,其中仅包含一个 struct:

extern volatile unsigned char ANSEL __at(0x09B);
typedef union {
    struct {
        unsigned ANS0       :1;
        unsigned ANS1       :1;
        unsigned ANS2       :1;
        unsigned ANS3       :1;
        unsigned ANS4       :1;
        unsigned ANS5       :1;
        unsigned ANS6       :1;
    };
} ANSELbits_t;
extern volatile ANSELbits_t ANSELbits __at(0x09B);

struct 包含在 包含 structunion 中是否有任何好处?

我猜它的访问将与简单的 struct 完全相同(因为 struct 是匿名的):

ANSELbits.ANS4 = 0;

标准可移植 C 没有任何好处。

但是像这样的代码用于绕过(以不可移植的方式)您的 C 编译器将进行的所有类型检查。

然后您可以一次性设置底层 struct 的所有成员,这在这种情况下很有用,因为它包含很多位字段。

如果你换行并没有什么区别,我想有人忘记添加另一个成员(或者没有复制粘贴所有内容),如下面的声明。不会抑制任何警告。

typedef union {
    struct {
        unsigned ANS0       :1;
        unsigned ANS1       :1;
        unsigned ANS2       :1;
        unsigned ANS3       :1;
        unsigned ANS4       :1;
        unsigned ANS5       :1;
        unsigned ANS6       :1;
    };
    uint8_t d8;
} ANSELbits_t;
extern volatile ANSELbits_t ANSELbits __at(0x09B);

顺便说一句,如果结构必须适合 1 个字节(8 位),则此声明是错误的,应改用 uint_t 类型。