数据在结构的打包结构中对齐最后结构

时间:2014-04-10 16:55:43

标签: c struct iar

这是我今天的第二个数据对齐问题,但我认为保证它自己的问题是不同的。我正在处理一些遗留代码,并且有些事情对我来说是新的:

我有一个包含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的声明中执行此操作时,编译器会发出警告。

1 个答案:

答案 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()