У меня есть структура, определенная как:
#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
.
Правильно ли мое подозрение? Или есть другая причина этих ошибок?