在 c++ 中,有没有办法保证 long 是 4 个字节?也许是 g++ 的编译器标志?
我们在 linux 程序中重用了一些 windows 代码,在 windows 中 long 是 4 个字节,但在我的 linux 机器上 long 是 8 个字节。我们不能将所有的 long 都更改为 int,因为这会破坏 windows 代码。
我需要保证 longs 是 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 似乎都喜欢将 longs 保留 4 个字节,而 linux g++ 通常使 longs 的大小与指针相同。
我倾向于在这里使用 uint32_t ,因为 Windows 代码中没有使用这种特殊结构,并且不会影响全局程序。希望代码的任何其他部分都不会出现问题。
我找到了编译器标志 -mlong32,但这也强制指针为 32 位,这是不可取的,并且因为它强制非标准行为可能会破坏像 PascalCuoq 提到的 ABI。