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的结构体紧凑对齐格式存储
版权声明:本文标题:Linux结构体紧凑,vc下和gcc的结构体紧凑对齐格式存储 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1732360999h1535213.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论