admin 管理员组

文章数量: 887006

Linux结构体紧凑,vc下和gcc的结构体紧凑对齐格式存储

一台windows机器和一台Linux机器、vxWorks (gnu)、ARM(stm32裸奔)、ADSP(裸奔)通信,传输一个结构体时,因为大家都是32位系统,结构体都是默认按4字节对齐,即双方对结构体不需要任何的存储限制,直接使用即可。

但有时,一方已经将传输的结构体声明为“紧凑”格式,就要双方按同样的限制格式约束:

1. VC下声明“紧凑”格式的结构体:

#pragma pack(push,1)//第二个参数1是指单字节对齐,32位的机器上默认4字节对齐

typedef struct

{

int  source;

int txSize;

char datSize;

char cmd;

}MYTYPE

#pragma pack(pop)

上述的结果为10,即4+4+1+1=10;如果按默认4字节对齐,则结果为12。

上述结构体声明完毕后,又恢复默认4字节对齐

2. gcc下声明“紧凑”格式的结构体:

struct ex {

int  source;

int txSize;

char datSize;

char cmd;

}__attribute__ ((packed, aligned(1)));

//或者直接使用已经定义好了的宏:_WRS_PACK_ALIGN(1);

上述sizeof(struct ex)=10

若在vxWorks中,推荐使用上述系统定义好的宏 _WRS_PACK_ALIGN(x)。

该宏定义的文件位置在:C:WindRiver-GPPVE-3.6-IA-Evalvxworks-6.6targethtoolgnutoolMacros.h

内容:

#define _WRS_PACK_ALIGN(x) __attribute__((packed, aligned(x)))

若使用typedef,如下:

typedef struct

{

int  source;

int  txSize;

char datSize;

char cmd;

}_WRS_PACK_ALIGN(1) MY_TYPE;

即在限定属性描述后加上自己的定义名就行了。

3. stm32(MDK)环境下,详见MDK--HELP--uversionhelp----compiler specific Features----9.2__align、9.6__attribute__((aligned))、9.91#pragma pack(n),解释的很清晰。

本文标签: Linux结构体紧凑 vc下和gcc的结构体紧凑对齐格式存储