c - 在 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 发布时不存在。
有人可以提出解决方案吗?
解决方案
如果您出于某种原因需要 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,那么升级很容易。
推荐阅读
- sql - 显示另一个表中是否存在值的 SQL 指令
- javascript - 如果 HTML“产品 A”存在,则使用 Javascript 将其更改为“价格 A”
- c# - 等待 FileSystemWatcher 结果
- python - Python 对象的 __iter__ 没有被调用
- reactjs - 在 TypeScript 项目中使用 props 设置样式化组件 CSS 规则
- mysql - Mysql:如何将数据添加到存储在变量中的现有数据中?
- java - CommonPool 而非自定义池中的 ParallelStream 队列任务
- jquery - jquery窗口调整大小功能恢复
- stm32 - 无法获得最大 ram 大小 - 带有 rtos 的 STM32
- templates - ElasticSearch - 带有动态模板的 copy_to