在C中的位域声明中缺少初始化程序

时间:2018-06-26 21:19:19

标签: c gcc struct bit-fields initializer

我有一个结构定义为:

 #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元素。

我的怀疑正确吗?还是这些错误还有其他原因?

0 个答案:

没有答案