【问题标题】:Restrict the size of built-in types限制内置类型的大小
【发布时间】:2015-02-02 09:49:25
【问题描述】:

我工作的公司曾经生产和维护基于 68k 处理器的小型嵌入式系统。我们想继续并停止维护那些有利于 Raspberry Pi 之类的东西,所以我正在移植用于为这些设备编写软件的内部库,以便可以为 Linux 交叉编译这些程序。

我遇到的问题是这些设备的规范保持严格的类型大小,即 16 位用于 short 和 32 位用于 int 和 long。因为 C 规范只定义了类型的最小大小,而我们的用户是科学家,几乎没有接受过“适当的编码”教育,所以我们在整个用户代码中都会遇到这样的情况:

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

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

【问题讨论】:

  • 你可以使用int16_t和类似的类型。
  • 我知道“正确”修复是让用户通过他们的源代码并将“int”替换为“int16_t”等,但我主要是在寻找一个解决方案不需要我们几十家外部公司重写数千行源代码。
  • 对我来说似乎不是问题。现有的 SW 需要 16 位 short 和 32 位 int 和 long。你有没有发现说 Raspberry Pi 没有 16 位 short 和 32 位 int 和 long 的东西?关键是规范在这里无关紧要。您的任务是选择符合 short 16 位、int 和 long 32 位要求的硬件。这几乎是任何 32 位系统,AFAIK 包括 Raspberry Pi。
  • 对于 x86,有一个 -m32 选项强制 GCC 发出 32 位代码,即使针对 64 位处理器也是如此。不确定该选项是否适用于其他处理器。
  • -mx32 发出 x86_64 代码但保持 long 32 位。 GCC docs.

标签: c gcc embedded


【解决方案1】:

你可以这样做

#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等。

再想一想:无论如何,您给出的示例可能由于不同的原因而失败:结构使用 padding,这可能使其实际大小大于其内容大小的总和。因此,为了使解决方案具有可移植性,您需要像示例中那样进行此类 malloc 调用,并在其中使用 sizeof 运算符(在您的示例中,您希望编写如下代码:@ 987654333@),您可以使用更脏的解决方案并将所有结构打包,其语法可能取决于编译器。

【讨论】:

  • 这是我们首先想到的解决方案之一,但是一些客户端代码使用了旧式的类型声明,例如 short int var 和 long int var,所以简单的定义通常不起作用。
  • @SteveRoschard:嗯,我认为,留下最明显的解决方案:制作一个小脚本来检查源文件并将所有出现的int 替换为int32_t,所有出现的shortshort intint16_t
猜你喜欢
  • 2016-10-26
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 2017-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多