我工作的公司曾经生产和维护基于 68k 处理器的小型嵌入式系统。我们希望继续前进并停止维护那些有利于 Raspberry Pi 之类的东西,所以我正在努力移植用于为这些设备编写软件的内部库,以便可以为 Linux 交叉编译程序。
我遇到的问题是这些设备的规范保持严格的类型大小,即 16 位短整型和 32 位整型和长整型。因为 C 规范只定义了类型的最小大小,而我们的用户是几乎没有接受过“适当编码”教育的科学家,所以我们在整个用户代码中都会遇到这样的情况:
typedef struct {
short int a;
short int b;
} Pair;
...
Pair * p=malloc(4);
如果可以避免,我们宁愿不让我们的用户大量重写他们的程序。重新编译 GCC 以完成此操作可能是一种选择,但我想在尝试之前知道它是否可行,因为我不想浪费精力。所以我的问题基本上是“GCC 或其他编译器中是否有某种方法可以将类型强制为特定大小”?
最佳答案
你可以做类似的事情
#define short int16_t
#define int int32_t
等,并将其添加到程序中。这是一个非常丑陋的解决方案,但它可以满足您的需求。
这些类型具有标准规定的特定大小。您需要包含 stdint.h
才能使这些类型可用。从 C99 开始,它们是 C 标准的一部分。
编辑:C 预处理器无法使用旧式short int
/long int
命名来处理它。对于这些情况,我建议制作一个小脚本来遍历源文件并将所有出现的 int
替换为 int32_t
,所有出现的 short
和short int
与int16_t
等
再三考虑编辑:无论如何,您给出的示例可能因不同的原因而失败:该结构使用填充,这可能使其实际大小大于其内容大小的总和。因此,为了使解决方案可移植,您需要像示例中那样进行 malloc
调用,并在其中使用 sizeof
运算符(在您的示例中,您我想编写这样的代码:Pair * p=malloc(sizeof(Pair));
),或者您可以使用更脏的解决方案并制作所有结构packed,其语法取决于编译器。
关于c - 限制内置类型的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28274894/