структурирует и ссылаясь на них двумя разными способами - PullRequest
2 голосов
/ 27 декабря 2010

Я читаю чей-то код, я не понимаю, почему он ссылается внутри каждого союза ниже.

-На первом он может ссылаться внутри, набрав pwr_cmd.EN1 -Во втором он может ссылаться внутри, набрав errors.Bits.ERR1 -Если я уберу Bits из второго, смогу ли я ссылаться на него так же, как и первый: errors.ERR1? -В чем разница между двумя и почему вы делаете один над другим? Спасибо.

typedef union {
    byte Byte;
    union {
        struct {
            byte EN1 :1;
            byte EN2 :1;
            byte EN3 :1;
            byte EN4 :1;
            byte :4;
        };
        struct {
            byte :2;
            byte EN34 :2;
            byte :4;
        };
        struct {
            byte :2;
            byte EN3r:1;
            byte EN4r:1;
            byte :4;
        };

    };
} pwr_cmd;



typedef union {
    word Word;
    union {
        struct {
            byte ERR1 :1;
            byte ERR2 :1;
            byte ERR3 :1;
            byte ERR4 :1;
            byte ERR5 :1;
            byte ERR6 :1;
            byte ERR7 :1;
            byte ERR8 :1;
            byte ERR9 :1;
            byte DET1 :1;
            byte DET2 :1;
            byte FAIL1 :1;
            byte PWR1 :1;
            byte PWR2 :1;
            byte PWR3 :1;
            byte PWR4 :1;
        } Bits;
            nibble4 Nibble4;
    };
} errors;

1 Ответ

2 голосов
/ 27 декабря 2010

Это пример битового поля - каждая переменная с ":" представляет определенное количество битов целого числа. Это битовое поле объединяется, чтобы позволить разным битовым позициям именоваться по-разному в зависимости от контекста.

Вы хотели бы получить доступ к одному члену профсоюза для ясности и для обозначения цели вашего кода - это хороший способ самодокументирования кода путем создания значимых имен вместо чего-то бессмысленного, например "бит 4".

Перечитайте ваш вопрос - разница между ними в том, что один использует именованные структуры, а другой - нет. В первом случае к элементам структур можно получить доступ без ссылки на элемент структуры ("."), Поскольку у них нет имени. Во втором он объявляет структуру с именем, поэтому используется ссылка на член структуры. На мой взгляд, второе более понятно, но первое более лаконично. Это вопрос стиля и предпочтений.

...