只包含一个结构的并集

时间:2019-01-27 15:58:44

标签: c struct unions

我今天开始在PIC16f88上编程,发现其寄存器的头包含一个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

union封装在仅{em> 包含struct的{​​{1}}内是否有好处?

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

ANSELbits.ANS4 = 0;

2 个答案:

答案 0 :(得分:2)

标准便携式C没有任何好处。

但是像这样的代码用于规避(以非便携式的方式)C编译器将进行的所有类型检查。

然后您就可以一次设置基础offset2的所有成员,这在这种情况下非常有用,因为它包含很多位字段。

答案 1 :(得分:2)

如果您换行,则没有任何区别,我想是有人放弃了添加另一个成员(或未复制粘贴所有内容),如下面的声明所示。没有警告将被禁止。

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类型。