我工作的公司曾经用于生产和维护基于68k处理器的小型嵌入式系统。我们希望继续前进并停止维护那些支持像Raspberry Pi这样的东西,所以我正在努力移植用于为这些设备编写软件的内部库,以便程序可以针对Linux进行交叉编译。
我遇到的问题是这些设备的规范保持严格的类型大小,即16位(简称)和32位(int和long)。因为C规范只定义了类型的最小大小,而且我们的用户是没有“正确编码”教育的科学家,所以我们在整个用户代码中遇到这样的情况:
typedef struct {
short int a;
short int b;
} Pair;
...
Pair * p=malloc(4);
如果可以避免,我们宁愿不让我们的用户广泛重写他们的程序。重新编译GCC以实现这一目标可能是一种选择,但我想在我尝试之前知道它是可能的,因为我不想浪费精力。所以我的问题基本上是“在GCC或其他编译器中是否有某种方法可以将类型强制为特定大小”?
答案 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
),或你可以使用更脏的解决方案并使所有结构打包,并且其语法可以是编译器依赖。