объединение, содержащее только одну структуру - PullRequest
0 голосов
/ 27 января 2019

Я начал сегодня программировать на 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, который только содержит это struct?

Его доступ, я думаю, будет точно таким же, как если бы это был простой struct (потому что struct является анонимным):

ANSELbits.ANS4 = 0;

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Нет никакой разницы, если вы переносите, и я полагаю, что кто-то уже забыл добавить другого участника (или не копировал-вставил все), как в объявлении ниже.Никакие предупреждения не будут подавлены.

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.

0 голосов
/ 27 января 2019

Нет смысла в стандартном переносимом C.

Но подобный код используется для обхода (непереносимым способом) всей проверки типов, которую будет выполнять ваш компилятор C.

Затем вы можете установить все элементы базового struct за один раз, что полезно в этом случае, поскольку оно содержит много битовых полей.

...