2012-01-02 50 views
6

由於各種原因,我有一些結構要強制爲特定的大小(在本例中爲64字節和512字節)。然而,兩者都低於我想要的尺寸。C中的強制特定結構尺寸

有沒有辦法讓我告訴編譯器將它們設置爲這些特定的大小並填充零,或者我最好只是在構造多餘空間的結構中聲明一個數組,以便它與我想要的大小?

+5

是什麼原因?可能有另一種方法來解決這個問題。 – 2012-01-02 21:48:50

+0

使用工會與字符陣列想起來... – amit 2012-01-02 21:49:15

+0

你可以嘗試某種破解'#pragma pack',但我不知道這將是多麼有用。 – Polynomial 2012-01-02 21:51:20

回答

17

您可以使用一個聯盟。

struct mystruct_s { 
    ... /* who knows how long */ 
}; 

typedef union { 
    struct mystruct_s s; 
    unsigned char padding[512]; 
} mystruct; 

這將確保聯合爲512字節或更多。然後,你可以確保它在你的代碼中使用靜態斷言的地方不超過512個字節:

/* Causes a compiler error if sizeof(mystruct) != 512 */ 
char array[sizeof(mystruct) != 512 ? -1 : 1]; 

如果使用的是C11,有一個更好的方式來做到這一點。我還不知道誰使用C11。該標準是在幾周前發佈的。

_Static_assert(sizeof(mystruct) == 512, "mystruct must be 512 bytes"); 

注意墊的唯一途徑與是有手動(callocmemset)把零。編譯器忽略填充字節。

+0

我喜歡這個,謝謝! – themaestro 2012-01-02 22:09:43

0

我不認爲有什麼辦法可以自動化這個,至少在gcc中是我使用的編譯器。你必須填補你的結構。

請注意結構中變量的automatic alignment。例如 結構示例{char_a; int b; }

不採取5個字節,但8