前言
协议的数据传输中,一般将数据封装成结构体,同时对结构体进行__packed来保证数据在传输中是连续的bit流。下面实验了__packed在结构体申明和定义中怎样的写法才是正确的。
结构体申明
typedef struct
{
uint8_t a;
uint16_t b;
uint16_t c;
} test0_t;
typedef struct __packed
{
uint8_t a;
uint16_t b;
uint16_t c;
} test1_t;
typedef struct
{
uint8_t a;
uint16_t b;
uint16_t c;
} __packed test2_t;
typedef struct
{
uint8_t a;
uint16_t b;
uint16_t c;
} test3_t __packed;
void strcut_packed_size_test(void)
{
debug_printf("sizeof(test0_t):%d,sizeof(test1_t):%d,
sizeof(test2_t):%d, sizeof(test3_t):%d",
sizeof(test0_t),
sizeof(test1_t),
sizeof(test2_t),
sizeof(test3_t));
}
sizeof(test0_t):6,sizeof(test1_t):5, sizeof(test2_t):5, sizeof(test3_t):6
结构体定义
struct
{
uint8_t a;
uint16_t b;
uint16_t c;
} test0;
struct __packed
{
uint8_t a;
uint16_t b;
uint16_t c;
} test1;
struct
{
uint8_t a;
uint16_t b;
uint16_t c;
} __packed test2;
struct
{
uint8_t a;
uint16_t b;
uint16_t c;
} test3 __packed;
void strcut_packed_size_test(void)
{
debug_printf("sizeof(test0):%d,sizeof(test1):%d,
sizeof(test2):%d, sizeof(test3):%d",
sizeof(test0),
sizeof(test1),
sizeof(test2),
sizeof(test3));
}
sizeof(test0):6,sizeof(test1):5, sizeof(test2):5, sizeof(test3):6
总结
从结构中可以发现,当__packed放在离结构体成员近的写法才有效。在不同编译环境的写法有时候不一样,最好是像以上模式去验证看看。