一台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-Eval\vxworks-6.6\target\h\tool\gnu\toolMacros.h
内容:
#define _WRS_PACK_ALIGN(x) __attribute__((packed, aligned(x)))
3. stm32(MDK)环境下,详见MDK--HELP--uversionhelp----compiler specific Features----9.2__align、9.6__attribute__((aligned))、9.91#pragma pack(n),解释的很清晰。