由於各種原因,我有一些結構要強制爲特定的大小(在本例中爲64字節和512字節)。然而,兩者都低於我想要的尺寸。C中的強制特定結構尺寸
有沒有辦法讓我告訴編譯器將它們設置爲這些特定的大小並填充零,或者我最好只是在構造多餘空間的結構中聲明一個數組,以便它與我想要的大小?
由於各種原因,我有一些結構要強制爲特定的大小(在本例中爲64字節和512字節)。然而,兩者都低於我想要的尺寸。C中的強制特定結構尺寸
有沒有辦法讓我告訴編譯器將它們設置爲這些特定的大小並填充零,或者我最好只是在構造多餘空間的結構中聲明一個數組,以便它與我想要的大小?
您可以使用一個聯盟。
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");
注意墊的唯一途徑與零是有手動(calloc
或memset
)把零。編譯器忽略填充字節。
我喜歡這個,謝謝! – themaestro 2012-01-02 22:09:43
我不認爲有什麼辦法可以自動化這個,至少在gcc中是我使用的編譯器。你必須填補你的結構。
請注意結構中變量的automatic alignment。例如 結構示例{char_a; int b; }
不採取5個字節,但8
是什麼原因?可能有另一種方法來解決這個問題。 – 2012-01-02 21:48:50
使用工會與字符陣列想起來... – amit 2012-01-02 21:49:15
你可以嘗試某種破解'#pragma pack',但我不知道這將是多麼有用。 – Polynomial 2012-01-02 21:51:20