1

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 ビットにすることも強制します。

4

3 に答える 3