这是我想要的结构:
typedef struct someip_header {
union {
uint32_t message_id;
struct {
uint16_t service_id;
uint8_t for_rpc : 1;
union {
uint16_t method_id : 15;
uint16_t event_id : 15;
};
};
};
} someip_header_t;
(原因是如果for_rpc为1,则最后15位表示事件ID,否则表示方法ID)
但是这个结构的大小是5个字节(打包),我猜是因为编译器不会将union放在未对齐状态。如果我用uint16_t val : 15
替换内部联合,则大小会按预期返回到4个字节:
typedef struct someip_header {
union {
uint32_t message_id;
struct {
uint16_t service_id;
uint8_t for_rpc : 1;
uint16_t method_event_id : 15;
};
};
} someip_header_t;
只是想知道,有没有办法收拾这个?它真的只是化妆品,但仍然......
答案 0 :(得分:2)
在字节级别形成union
:
typedef struct someip_header {
union {
uint32_t message_id;
struct {
uint16_t service_id;
union {
struct {
uint8_t for_rpc : 1;
uint16_t method_id : 15;
};
struct {
uint8_t for_rpc_2 : 1;
uint16_t event_id : 15;
};
};
};
};
} someip_header_t;