【问题标题】:Data Align Last Struct in Packed Struct of Structs数据对齐结构的压缩结构中的最后一个结构
【发布时间】:2014-04-10 16:55:42
【问题描述】:

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

我有一个包含 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 给了我一个编译指示),但我不清楚我想在哪里进行这种对齐。当我尝试在结构的结构声明中执行此操作或尝试在 BLOCK8_STRUCT 的声明中执行此操作时,编译器会发出警告。

【问题讨论】:

    标签: c struct iar


    【解决方案1】:
    #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()
    

    【讨论】:

    • 只是为了澄清:这将与该结构的每个成员的 4 个字节对齐。这可能没问题,我将不得不考虑后果,但如果我只想 4 字节对齐 BLOCK8_STRUCT blk8 怎么办?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多