組み込みシステム用の C++ コードに取り組んでいます。コードが使用する I/O インターフェイスでは、各メッセージのサイズ (バイト単位) が 2 のべき乗である必要があります。現在、コードは次のようなことをしています (いくつかの場所で):
#pragma pack(1)
struct Message
{
struct internal_
{
unsigned long member1;
unsigned long member2;
unsigned long member3;
/* more members */
} internal;
char pad[64-sizeof(internal_)];
};
#pragma pack()
初めて64ビットのFedoraでコードをコンパイルしようとしていますlong
.64ビットです。この場合、sizeof(internal_)
は 64 より大きいため、配列サイズの式がアンダーフローし、コンパイラは配列が大きすぎると警告します。
理想的には、構造体のサイズを取得し、コンパイル時にパディング配列の必要なサイズを評価して、構造体のサイズを 2 の累乗に丸めるマクロを記述できるようにしたいと考えています。
私はBit Twiddling Hacksのページを見てきましたが、そこにあるテクニックのいずれかが実際にマクロに実装され、コンパイル時に評価されるかどうかはわかりません。
この問題に対する他の解決策はありますか? それとも、問題を永続させて、魔法の 64 を魔法の 128 に変更する必要がありますか?