限制内置类型的大小

时间:2015-02-02 09:49:25

标签: c gcc embedded

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

我遇到的问题是这些设备的规范保持严格的类型大小,即16位(简称)和32位(int和long)。因为C规范只定义了类型的最小大小,而且我们的用户是没有“正确编码”教育的科学家,所以我们在整个用户代码中遇到这样的情况:

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

如果可以避免,我们宁愿不让我们的用户广泛重写他们的程序。重新编译GCC以实现这一目标可能是一种选择,但我想在我尝试之前知道它是可能的,因为我不想浪费精力。所以我的问题基本上是“在GCC或其他编译器中是否有某种方法可以将类型强制为特定大小”?

1 个答案:

答案 0 :(得分:1)

您可以执行类似

的操作

#define short int16_t

#define int int32_t

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

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

编辑:C预处理器无法使用旧式short int / long int namings处理它。对于这些情况,我建议制作一个小脚本来浏览源文件并将int的所有出现替换为int32_t,所有出现的short { {1}} short int

编辑另一个想法:无论如何,您提供的示例可能会因为其他原因而失败:struct使用 padding ,这可以使其实际大小大于其内容大小的总和。因此,为了使解决方案具有可移植性,您需要像示例中那样进行int16_t次调用,并在其中使用malloc运算符(在您的示例中,您需要创建代码)像这样:sizeof),你可以使用更脏的解决方案并使所有结构打包,并且其语法可以是编译器依赖。