限制内置类型的大小

3
我所在的公司曾经生产和维护基于68k处理器的小型嵌入式系统。我们希望向前发展,停止维护这些系统,并改用像树莓派这样的设备。因此,我正在移植内部库,以便为这些设备编写软件并进行交叉编译。
我遇到的问题是,这些设备的规格要求严格的类型大小,即short为16位,int和long为32位。由于C规范仅定义了类型的最小尺寸,而我们的用户是缺乏“正式编码”教育的科学家,因此我们在用户代码中遇到了许多类似以下情况的问题:
typedef struct {
    short int a;
    short int b;
} Pair;
...
Pair * p=malloc(4);

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

3
你可以使用int16_t和类似的类型。 - mch
2
对我来说似乎不是问题。现有的软件期望16位短整型和32位整型和长整型。你找到了什么东西表明树莓派没有16位短整型和32位整型和长整型?重点是规格在这里是无关紧要的。你的任务是选择符合短整型是16位,整型和长整型是32位的要求的硬件。基本上任何32位系统都可以,而且据我所知,包括树莓派。 - user3386109
1
对于x86架构,有一个-m32选项,它可以强制GCC生成32位代码,即使目标处理器是64位的。不确定该选项是否适用于其他处理器。 - user3386109
1
-mx32 会生成 x86_64 代码,但保持 long 为 32 位。GCC 文档 - mafso
顺便提一下,malloc 函数需要以字节为单位指定大小,而不是以位为单位。如果这是真正的代码,也许你不需要改变任何东西 :S - mafso
显示剩余8条评论
1个回答

1
您可以像这样做:

#define short int16_t

#define int int32_t

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

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

编辑:C预处理器无法处理旧式的short int/long int命名。对于这些情况,我建议编写一个小脚本来遍历源文件,并将所有出现的int替换为int32_t,所有出现的shortshort int都替换为int16_t,等等。

另外再考虑一下:无论如何,你提供的示例可能因为一个不同的原因而失败:结构体使用了填充,这可能使其实际大小大于其内容大小的总和。因此,为了使解决方案具有可移植性,您需要像示例中那样通过这些malloc调用,并在其中使用sizeof运算符(在您的示例中,您需要将代码写成这样:Pair * p = malloc(sizeof(Pair));),或者您可以使用更加危险的解决方案,使所有结构体紧凑,语法可能取决于编译器。

这是我们最初考虑的解决方案之一,但是一些客户端代码使用旧式类型声明,例如short int var和long int var,因此简单的定义通常不起作用。 - Steve Roschard
4
@SteveRoschard说:我认为最明显的解决方案是编写一个小脚本,遍历源文件并替换所有出现的intint32_t,所有出现的shortshort intint16_t等。 - user3079266

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接