1.#pragma 是一种预处理指令,用于向编译器提供特定的指示或控制编译过程。结构体定义前出现#pragma时,通常用于控制结构体的内存对齐方式。
2.主要作用:
内存对齐控制:最常见的用途是控制结构体的内存对齐方式。
3.使用方法1
#pragma pack(1) //保存当前对齐状态,并设置对齐为1字节
typedef struct { //该结构体字节没有对齐
char terminalNumber[10]; //终端编码
uint8_t commandCode; //命令代码
uint8_t commandLength; //命令长度
uint8_t restartResult; //重启结果
uint16_t crc; //校验码
}DeviceRestart_t;
typedef struct { //该结构体字节没有对齐
char terminalNumber[10]; //终端编码
uint8_t commandCode; //命令代码
uint8_t commandLength; //命令长度
uint8_t changeResult; //参数更改结果
uint16_t crc; //校验码
}ApplyChangeParam_t;
typedef struct { //该结构体字节没有对齐
char terminalNumber[10]; //终端编码
uint8_t commandCode; //命令代码
uint8_t commandLength; //命令长度
uint8_t saveResult; //更改结果
uint16_t crc; //校验码
}ApplySaveParam_t;
#pragma pack()
这种用法确保结构体成员紧密排列,没有填充字节,常用于网络传输或文件读写时确保数据布局一致
使用方法2:
// 1字节对齐
#pragma pack(push, 1) // 保存当前对齐状态,并设置对齐为1字节
struct MyStruct {
char a;
int b;
short c;
};
#pragma pack(pop) // 恢复之前的对齐状态
4.对齐控制
#pragma pack(n):设置对齐字节数为n
#pragma pack(push, n):保存当前对齐并设置新对齐
#pragma pack(pop):恢复之前保存的对齐
1. #pragma pack(1) 的版本
强制结构体成员按1字节对齐(即无对齐填充),所有成员紧密排列,没有间隙,结构体总大小 = 各成员大小之和。
2.#pragma pack(push, n) 的版本
5.注意:
过度使用可能导致代码可移植性降低,跨平台开发中要特别小心。