在GCC 3.2、4.4和5.4中启用C89中的long-long
我在C89工作的环境非常有限。我需要为基于GCC4.4的编译器编写代码,但我的代码也必须通过使用GCC3.2编译的测试。我们的日常开发编译器是GCC 5.4。就我个人而言,这听起来很疯狂,但这是我发的牌 因为我们需要64位整数,所以我们采取了放宽C89规则的步骤,以便使用在GCC 3.2、4.4和5.4中启用C89中的long-long,c,gcc,embedded,gcc3,gcc4.4,C,Gcc,Embedded,Gcc3,Gcc4.4,我在C89工作的环境非常有限。我需要为基于GCC4.4的编译器编写代码,但我的代码也必须通过使用GCC3.2编译的测试。我们的日常开发编译器是GCC 5.4。就我个人而言,这听起来很疯狂,但这是我发的牌 因为我们需要64位整数,所以我们采取了放宽C89规则的步骤,以便使用long。我们的初始代码处理如下问题: #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wlong-long" typedef uns
long
。我们的初始代码处理如下问题:
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wlong-long"
typedef unsigned long long my_type
#pragma GCC diagnostic pop
不幸的是,这在GCC4.4中不起作用,因为在GCC4.6中引入了推送和弹出操作,所以我将其更改为:
#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
编译的,我怀疑在GCC 3.2发布时,#pragma GCC diagnostic
并不存在
有人能提出一个解决方案吗?如果你出于某种原因需要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,它将是一个简单的升级。那么为什么不使用命令行将
-Wno long
传递给编译器选项呢?为什么要使用pragma?技术负责人认为,如果我们这样做,人们就有太多的空间开始在代码上放long
。@Walkinbeard您无论如何都不应该使用默认的int、long等类型