如何保证long是4个字节

时间:2013-08-14 17:27:35

标签: c++ g++

在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。

3 个答案:

答案 0 :(得分:4)

您可以使用stdint.h中的int32_t。

答案 1 :(得分:3)

您可能希望创建一个使用typedef(首选)或预处理器宏来定义常用类型名称的头文件,而不是使用intlong

#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发行版中安装这些库,您可能需要让用户安装它们。