如何在联盟中跨越位域?

时间:2016-05-05 08:48:09

标签: c

这是我想要的结构:

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;

只是想知道,有没有办法收拾这个?它真的只是化妆品,但仍然......

1 个答案:

答案 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;