2012-01-02 13 views
6

さまざまな理由から、特定のサイズ(この場合は64バイトと512バイト)にする必要がある構造体がいくつかあります。しかしどちらも、私が望むサイズより幾分下回っています。Cでの強制的な構造体サイズ

これらの特定のサイズとパッドをゼロに設定するようにコンパイラに指示する方法はありますか、余分なスペースを構成する構造体内の配列を宣言するだけの方が良いでしょう。私は欲しいのですか?

+5

理由は何ですか?問題を解決する別の方法があるかもしれません。 –

+0

文字列の集合体を使用しているユニオンを使用しています... – amit

+0

'#pragma pack'で何らかのハックを試みることができますが、これはどれくらい便利なのか分かりません。 – Polynomial

答えて

17

あなたは労働組合を使用することができます。

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

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

これは、ユニオンが512バイト以上であることを保証します。あなたはC11を使用している場合は、これを行うには良い方法がある

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

:その後、あなたはそれがどこかにあなたのコードの静的アサーションを使用していない以上512バイト以下であることを確認することができます。私はまだC11を使っている人は誰も知らない。標準は数週間前に出版されました。

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

ゼロとパッドへの唯一の方法は、手動で(calloc又はmemset)がゼロを置くことであること。コンパイラは、パディングバイトを無視します。

+0

私はこれが好きです、ありがとう! – themaestro

0

少なくとも私が使っているコンパイラであるgccでは、これを自動化する方法はないと思います。構造体を埋めなければなりません。

structの変数automatic alignmentに注意してください。たとえば、 の構造体例{ char a; int b; }

は5つのバイトを取ることはありませんが、8