c++ で、long が 4 バイトであることを保証する方法はありますか? おそらくg ++のコンパイラフラグですか?
Linux プログラムでいくつかの Windows コードを再利用しています。Windows では long は 4 バイトですが、私の Linux マシンでは long は 8 バイトです。すべての long を int に変更することはできません。Windows コードが壊れてしまうからです。
long が 4 バイトであることを保証する必要がある理由は、コードの特定の部分で構造体と char 配列の共用体があり、64 ビット Linux 用にコンパイルすると、char 配列が他の構造体と一致しないためです。
明確にするために、いくつかのコード スニペットを次に示します。
struct ABC {
unsigned long data1;
unsigned short data2;
unsigned short data3;
unsigned char data4[8];
};
//sizeof(ABC) (32 bit): 16, sizeof(ABC) (64 bit): 24
union ABC_U {
ABC abc;
unsigned char bytes[16];
};
編集:
言い忘れましたが、この問題は 64 ビット用にコンパイルしようとしたときにのみ発生しました。Windows は、アーキテクチャに関係なく long を 4 バイトに保つのが好きなようですが、Linux g++ は通常 long をポインターと同じサイズにします。
この特定の構造は Windows コードでは使用されず、プログラム全体に影響を与えないため、ここでは uint32_t を使用することに傾いています。これが問題になるコードの他のセクションがないことを願っています。
私はコンパイラフラグ -mlong32 を見つけましたが、これはポインタを 32 ビットにすることも強制します。