在c ++中,有没有办法保证long是4个字节?也许是g ++的编译器标志?
我们正在重用linux程序中的一些windows代码,而在windows中长4个字节,但在我的linux机器上,长的是8个字节。我们无法将所有长篇内容更改为整数,因为这会破坏Windows代码。
我需要保证long的原因是4个字节,因为在代码的某些部分,我们有一个struct和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似乎都希望保留4个字节,而linux g ++通常会使long与指针的大小相同。
我倾向于在这里使用uint32_t,因为Windows代码中没有使用此特定结构,这不会影响全局程序。希望代码中没有任何其他部分会出现问题。
我发现编译器标志-mlong32,但这也强制指针为32位,这是不可取的,因为它强制非标准行为可能会破坏像PascalCuoq所提到的ABI。
答案 0 :(得分:4)
您可以使用stdint.h中的int32_t。
答案 1 :(得分:3)
您可能希望创建一个使用typedef(首选)或预处理器宏来定义常用类型名称的头文件,而不是使用int
和long
。
#ifdef _WINDOWS
typedef unsigned long uint32;
#else
typedef unsigned int uint32;
#endif
在你的工会中,你会使用uint32
代替long
。
头文件stdint.h
正是这样做的,但并不总是作为每个编译器的标准头文件安装。默认情况下,Visual Studio(例如)没有它。如果您愿意使用它,可以从http://msinttypes.googlecode.com/svn/trunk/stdint.h下载。
答案 2 :(得分:0)
您希望编译器生成long
为32位的代码。
使用-m32
编译整个代码库。这将在旧的IA-32指令集中生成代码,该指令集仍然在库中得到广泛支持(*),其中long
传统上是32位,如int
。
(*)您可能需要在Linux发行版中安装这些库,您可能需要让用户安装它们。