Отсутствует инициализатор в объявлении битового поля в C - PullRequest
0 голосов
/ 27 июня 2018

У меня есть структура, определенная как:

 #pragma pack(push,1)
 typedef struct {
     uint8_t source_ID;
     uint8_t dest_ID;
     union {
         uint8_t node_ID;

         struct {
             unsigned int dest   : 4; 
             unsigned int source : 4;
         };
     };
 } IDs_t; 
 #pragma pack(pop)

Когда я объявляю одну из этих структур, я делаю следующее:

IDs_t IDs = {         
    .source_ID = TWI,
    .dest_ID = APP,
    .source = INTERNAL,
    .dest = LISTENER,
};

Значения, которые я им устанавливаю, равны #define значениям.

Когда я компилирую код, он работает, ошибок нет.

Если я объявлю одну из структур следующим образом:

IDs_t IDs = {         
    .source_ID = TWI,
    .dest_ID = APP,
    .dest = LISTENER,
    .source = INTERNAL,
};

Тогда я получаю следующие ошибки:

501: 9: ошибка: отсутствует инициализатор [-Werror = missing-field-initializers] 501: 9: ошибка: (близка к инициализации для «Идентификаторы ... источник») [-Werror = недостающее поле Инициализаторы]

Когда все, что я сделал, это переупорядочил объявления элементов. Разве это не разрешено? Кажется, я не могу найти ответ, но у меня есть подозрение. Я подозреваю, что, поскольку я использую ядро ​​ARM от ST, память имеет формат little-endian. Это означает, что элемент source является младшим битом элемента node_ID. Поэтому я должен сначала объявить LSB, а затем MSB, который будет элементом dest.

Правильно ли мое подозрение? Или есть другая причина этих ошибок?

...