首页 > 解决方案 > 在 GCC 3.2、4.4 和 5.4 的 C89 中启用 long long

问题描述

我在相当受限的环境中使用 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 发布时不存在。

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

标签: cgccembeddedgcc3gcc4.4

解决方案


如果您出于某种原因需要 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,那么升级很容易。


推荐阅读