这是我今天的第二个数据对齐问题,但我认为保证它自己的问题是不同的。我正在处理一些遗留代码,并且有些事情对我来说是新的:
我有一个包含4个结构和一些字节/单词的压缩结构。我需要最后一个结构,typedef'd BLOCK8_STRUCT(目前它实际上只是一个8位数组)是4字节对齐的;不关心其他结构。我从来没有在我的代码中直接引用那个特定的结构;我只通过声明结构的结构来访问它(希望这是有意义的)。
这是我希望4字节对齐的结构的声明:
typedef __packed struct
{
u8 data[1024];
} BLOCK8_STRUCT;
这是我的结构声明结构:
typedef __packed struct
{
BLOCK1_STRUCT blk1;
#if NOV_BLK1_PADDING != 0
u8 blk1_pad[NOV_BLK1_PADDING];
#endif
u32 blk1_rev_and_sum;
BLOCK6_STRUCT blk6;
#if NOV_BLK6_PADDING != 0
u8 blk6_pad[NOV_BLK6_PADDING];
#endif
u32 blk6_rev_and_sum;
BLOCK7_STRUCT blk7;
u8 blk7_pad[NOV_BLK7_PADDING];
u32 blk7_rev_and_sum;
BLOCK8_STRUCT blk8;
u32 blk8_rev_and_sum;
} PARAM_BLOCK_IMAGE_STRUCT;
我想确保当我实际初始化结构体结构的实例时,BLOCK8_STRUCT是4字节对齐的。我知道如何对齐数据(IAR给了我一个pragma这样做),但我不清楚我想在哪里进行这种对齐。当我尝试在结构体结构的声明中执行此操作时,或者当我尝试在BLOCK8_STRUCT的声明中执行此操作时,编译器会发出警告。
答案 0 :(得分:0)
#pragma pack(4)
typedef struct
{
BLOCK1_STRUCT blk1;
#if NOV_BLK1_PADDING != 0
u8 blk1_pad[NOV_BLK1_PADDING];
#endif
u32 blk1_rev_and_sum;
BLOCK6_STRUCT blk6;
#if NOV_BLK6_PADDING != 0
u8 blk6_pad[NOV_BLK6_PADDING];
#endif
u32 blk6_rev_and_sum;
BLOCK7_STRUCT blk7;
u8 blk7_pad[NOV_BLK7_PADDING];
u32 blk7_rev_and_sum;
BLOCK8_STRUCT blk8;
u32 blk8_rev_and_sum;
} PARAM_BLOCK_IMAGE_STRUCT;
#pragma pack()