限制内置类型的大小

Restrict the size of built-in types

我工作的公司曾经生产和维护基于 68k 处理器的小型嵌入式系统。我们想继续前进并停止维护那些有利于 Raspberry Pi 之类的东西,所以我正在努力移植用于为这些设备编写软件的内部库,以便可以交叉编译程序Linux。

我遇到的问题是这些设备的规范保持严格的类型大小,即 16 位短型和 32 位整型和长型。因为 C 规范只定义了类型的最小大小,而我们的用户是受过很少 "proper coding" 教育的科学家,我们 运行 在整个用户代码中遇到这样的情况:

typedef struct {
    short int a;
    short int b;
} Pair;
...
Pair * p=malloc(4);

如果可以避免,我们宁愿不让我们的用户大量重写他们的程序。重新编译 GCC 以完成此操作可能是一种选择,但我想在尝试之前知道它是否可行,因为我不想浪费精力。所以我的问题基本上是 "Is there some way in GCC or another compiler to force types to a certain size"?

你可以这样做

#define short int16_t

#define int int32_t

等,并将其添加到程序中。这是一个非常丑陋的解决方案,但它可以满足您的需求。

这些类型具有标准规定的特定大小。您需要包含 stdint.h 才能使用这些类型。从 C99 开始,它们是 C 标准的一部分。

EDIT:C 预处理器无法使用旧式 short int / long int 命名来处理它。对于这些情况,我建议制作一个小脚本来遍历源文件,并将所有出现的 int 替换为 int32_t,所有出现的 short short intint16_t

再次考虑编辑:无论如何,您给出的示例可能因不同原因而失败:结构使用 padding,它可以使其实际大小大于其内容大小的总和。因此,为了使解决方案可移植,您需要像示例中那样进行 malloc 调用,并在其中使用 sizeof 运算符(在您的示例中,您需要编写代码像这样:Pair * p=malloc(sizeof(Pair));), or 你可以使用更脏的解决方案并使所有结构 packed, 其语法可以是编译器依赖。