1

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

4

3 回答 3

4

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

于 2013-08-14T17:37:59.093 回答
3

您可能希望创建一个头文件,而不是使用intand ,该头文件使用 typedef(首选)或预处理器宏来定义供您使用的通用类型名。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下载它。

于 2013-08-14T17:38:56.713 回答
0

您希望编译器生成long32 位的代码。

用 . 编译整个代码库-m32。这将在旧的 IA-32 指令集中生成代码,该指令集仍然广泛支持 library-wise(*),并且long传统上是 32 位的int.

(*) 您可能需要在您的 Linux 发行版中安装这些库,并且您可能需要让您的用户安装它们。

于 2013-08-14T17:38:21.510 回答