【问题标题】:Enabling long long in C89 at GCC 3.2, 4.4 and 5.4在 GCC 3.2、4.4 和 5.4 的 C89 中启用 long long
【发布时间】:2020-08-03 12:38:16
【问题描述】:

我在 C89 中工作,环境非常有限。我需要为基于 GCC 4.4 的编译器编写代码,但我的代码还必须通过使用 GCC 3.2 编译的测试。我们日常的开发编译器是 GCC 5.4。就我的钱而言,这听起来很疯狂,但这些都是我收到的牌。

因为我们需要 64 位整数,所以我们采取了放宽 C89 规则的步骤,以便使用long long。我们的初始代码处理这样的问题:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wlong-long"
typedef unsigned long long my_type
#pragma GCC diagnostic pop

不幸的是,这不适用于 GCC 4.4,因为在 GCC 4.6 中引入了 push 和 pop 操作,所以我将其更改为:

#pragma GCC diagnostic ignored "-Wlong-long"
typedef unsigned long long my_type
#pragma GCC diagnostic error "-Wlong-long"

唉,GCC 3.2 不喜欢它:

warning: ignoring #pragma GCC diagnostic
ISO C89 does not support `long long'
warning: ignoring #pragma GCC diagnostic

看到它是用-Wunknown-pragmas编译的,我怀疑#pragma GCC diagnostic在GCC 3.2发布时并不存在。

有人可以提出解决方案吗?

【问题讨论】:

  • 那么为什么不使用命令行将-Wno-long-long 传递给编译器选项呢?为什么要使用编译指示?
  • 技术主管认为,如果我们这样做,人们将有太多空间开始在代码中添加long long
  • @Walkinbeard 你永远不应该使用默认类型 int、long 等

标签: c gcc embedded gcc3 gcc4.4


【解决方案1】:

如果您出于某种原因需要 c89,那么尝试通过 奇怪的编译器黑客攻击 来颠覆它不太可能符合任何人的最佳利益。 你可以定义你的类型:

typedef struct { unsigned _[2]; } my_type;

然后在 C 或 asm 中编写相应的操作,例如:

my_type MyAdd(my_type a, my_type b);
my_type MySub(my_type a, my_type b);
...

有一天,如果允许您使用较新版本的 C,升级很容易。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 2010-10-11
    相关资源
    最近更新 更多