【发布时间】:2015-02-02 09:49:25
【问题描述】:
我工作的公司曾经生产和维护基于 68k 处理器的小型嵌入式系统。我们想继续并停止维护那些有利于 Raspberry Pi 之类的东西,所以我正在移植用于为这些设备编写软件的内部库,以便可以为 Linux 交叉编译这些程序。
我遇到的问题是这些设备的规范保持严格的类型大小,即 16 位用于 short 和 32 位用于 int 和 long。因为 C 规范只定义了类型的最小大小,而我们的用户是科学家,几乎没有接受过“适当的编码”教育,所以我们在整个用户代码中都会遇到这样的情况:
typedef struct {
short int a;
short int b;
} Pair;
...
Pair * p=malloc(4);
如果可以避免,我们宁愿不让我们的用户大量重写他们的程序。重新编译 GCC 以完成此操作可能是一种选择,但我想在尝试之前知道这是可能的,因为我不想浪费精力。所以我的问题基本上是“在 GCC 或其他编译器中是否有某种方法可以强制类型为特定大小”?
【问题讨论】:
-
你可以使用
int16_t和类似的类型。 -
我知道“正确”修复是让用户通过他们的源代码并将“int”替换为“int16_t”等,但我主要是在寻找一个解决方案不需要我们几十家外部公司重写数千行源代码。
-
对我来说似乎不是问题。现有的 SW 需要 16 位 short 和 32 位 int 和 long。你有没有发现说 Raspberry Pi 没有 16 位 short 和 32 位 int 和 long 的东西?关键是规范在这里无关紧要。您的任务是选择符合 short 16 位、int 和 long 32 位要求的硬件。这几乎是任何 32 位系统,AFAIK 包括 Raspberry Pi。
-
对于 x86,有一个
-m32选项强制 GCC 发出 32 位代码,即使针对 64 位处理器也是如此。不确定该选项是否适用于其他处理器。 -
-mx32发出 x86_64 代码但保持long32 位。 GCC docs.