vc下和gcc的结构体紧凑对齐格式存储【#pragma pack(push,1)、__attribute__ ((packed, aligned(1)))】

一台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)))

若使用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),解释的很清晰。



你可能感兴趣的:(vxWorks,VC++,Linux)