2017-11-29 1 views
-1

は、構造体の内部パディングのためのマクロを使用する方法がありますが、私はそのような意味:はCでパディングメンバーを定義する++

struct Monument{ 
    char name[32]; 
    PADDING(4 * sizeof(int)); 
    int cityId; 
    PADDING(4 * sizeof(int)); 
    int age; 

} 

PADDING(S)マクロは単にスペースを追加する場所。

+2

このマクロを実装したら、コンパイラが構造体に追加のパディングを追加していないことを確認してください。 – drescherjm

+0

私にX-Yの問題のように聞こえます。 – Zereges

+0

@Zereges:必ずしもそうではありません。メンバー間のパディングが明示的に指定され、コンパイラによって制御されない場合(通常はいくつかのinteropの状況)があります。 –

答えて

1

あなたはそのように定義することができます:あなたはそれ(今まで は他の可能なメンバーと衝突しない好ましくは1)を好きなように

#define TOKENPASTE(x, y) x ## y 
#define TOKENPASTE2(x, y) TOKENPASTE(x, y) 
#define PADDING(size) char TOKENPASTE2(padding_, __LINE__) [size] 

変更フィールド名のプレフィックス。

コンパイラが予期しないパディングを追加することがあることに注意してください(Remy LebeauとFrançoisAndrieuxのコメント)。参考のためにあなたが読むことができます:

編集:申し訳ありませんが、最初のコードは(それが間違ってマクロで__LINE__展開を使用していた)間違っていました。 https://stackoverflow.com/a/1597129/1561140

+1

コンパイラがメンバー間に独自のパディングを追加しないように、構造体の配置を1バイトに設定してください。 –

+0

@FrançoisAndrieux私の間違い、ありがとう!私はそれを修正しました。 – nobody

+2

私は、C++で予期しないパディングが追加されることがあることをお勧めします。例えば、配置の制限のために、2つの 'int'間の' PADDING(1); 'は、ほとんどの実装で実際に1バイト以上のパディングを導入します。コンパイラが[非標準レイアウト](http://en.cppreference.com/w/cpp/language/data_members#Standard_layout)に何をするかを時々伝えることも難しいです。 [構造体のサイズが各メンバーのsizeofの合計と等しいのはなぜですか?](https://stackoverflow.com/questions/119123/why-isnt-sizeof-for-a-struct-equal-to-各部材の大きさの和)を算出する。 –

関連する問題