2014-04-10 60 views
0

這是我今天的第二個數據對齊問題,但我認爲它不同於自己的問題。我正在使用一些遺留代碼,並且有幾件事情對我來說是新的:數據對齊結構的壓縮結構中的最後一個結構

我有一個包含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; 

我想確保當我真正用來初始化一個結構體struct的實例BLOCK8_STRUCT是4字節對齊的。我知道如何對齊數據(IAR爲我提供了一個附註),但是我不清楚在哪裏我想要做這種對齊。當我嘗試在聲明結構體的聲明時嘗試執行此操作時,或者當我嘗試在BLOCK8_STRUCT聲明中執行此操作時,編譯器會發出警告。

回答

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() 
+0

只是爲了說明:這將對齊到該結構的每個成員的4個字節。這可能是好的,我將不得不考慮這種影響,但如果我只想要4字節對齊BLOCK8_STRUCT blk8,該怎麼辦? – nobby