c - 限制内置类型的大小

标签 c gcc embedded

我工作的公司曾经生产和维护基于 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 intint16_t

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

关于c - 限制内置类型的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28274894/

相关文章:

c - 用位移位代替加法运算

C 指针结构,不兼容的类型

java - 线程局部区域 (TLA) 和线程堆栈大小 (Xss) 之间有什么区别?

c - 如何在所有前台进程或特定前台进程之前运行后台进程?

c - Realloc() 即使经过大量阅读也无法理解

c++ - 如何从 C 或 C++ 语言级别安全地访问内存映射硬件寄存器?

C - main() 命令行参数

c - 如何将子进程的标准输出重定向到标准输入?

c - 错误 : expected ‘=’ , ‘,’ 、 ‘;’ 、 ‘asm’ 或 ‘__attribute__’ 之前

embedded - Neon VLD 消耗的周期比预期多?