我有一个结构定义为:
#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:错误:(在初始化附近 'IDs ... source') [-Werror = missing-field-initializers]
当我所做的只是重新排列元素声明的顺序。这是不允许的吗?我似乎找不到答案,但我有所怀疑。我的怀疑是,由于我使用的是ST的ARM内核,因此内存为小端格式。这意味着source
元素是node_ID
元素的LSB。因此,我必须先声明LSB,然后再声明MSB,这将是dest
元素。
我的怀疑正确吗?还是这些错误还有其他原因?