2011-06-28 2 views

答えて

4

MyCharは、cの後に名前のないパディングバイトを持つ可能性があります。したがって、いいえ、sizeof(MyChar)1であることを保証するものではありません。

+0

そのパディングを回避するために、任意の標準言語サポートはありますか? – iammilind

+0

Nope;あなたの唯一の選択肢は、プラグマ/属性をパックするコンパイラ固有の構造体を実際に使用することです。 –

+1

多くの一般的なコンパイラは、 '#pragma pack(1)'を使用しています... GCC、IBM、MS ...後でデフォルトのパッキングを復元するにはちょっと変わったかもしれません。 –

2

MSVCでは、使用することができます:

#pragma pack(1) 
struct MyChar 
{ 
    char c; 
}; 

// Restore 
#pragma pack() 
+0

本当ですか?私は、あなたが '#pragma pack(push)/ #pragma pack(1)'を '#pragma pack(pop)'の後に使用する必要があることはほとんど確信しています。 '#pragma pack()'はパックの値をデフォルトに戻します。それはあなたの '#pragma pack(1)'の前にあったものではないかもしれません。 –

+0

'push'と' pop'は、プラグマパックのスタックアップに使用されます。彼らは必要ではありません。例えば、あなたのパッキングは2、次に4、そして1、そこに 'push/pop'を使うかもしれません。私は 'pack(1)'を使い、 'pack()'を使って元に戻り、必要に応じて動作します。 – Ajay

関連する問題