为什么gcc会对long long类型发出警告?

35

-Wlong-long 是 GCC 的一个警告选项,用于当编译器遇到长长类型时发出警告。

参考 gcc 手册:

-Wlong-long
       Warn if long long type is used.  This is enabled by either -Wpedantic or -Wtraditional in ISO C90 and C++98 modes.  To inhibit the warning messages, use -Wno-long-long.

据我所知,long long 至少需要64位(实际上它在今天的编译器中通常都是64位)。这在ISO C90或C++98中是否不是这样,还是由于其他原因不使用 long long

我知道有像 int64_t 这样的 <stdint.h> 类型,但是一些老旧的编译器(例如VS2005和Green Hills ARM 3.5)不提供 <stdint.h>,而我认为对于那些和更新的工具链来说,long long (至少)会是64位。


没有 stdint.h 的编译器不符合 C99 标准,这意味着它们很可能根本没有 long long!(除非它们是旧版本的 GCC。) - zwol
从所描述的内容看,Patrick的“不那么古老”的编译器与90年代的gcc在同一类别中——使用stdint.h没有long long(除了在90年代的大多数时间里我们有个借口:C99还没有被写出来,再加上“普通”的CPU没有64位整数寄存器,因此在基本的C类型中缺少一个64位整数也是有些合理的。) - user2404501
@WumpusQ.Wumbley:C语言的设计初衷是为了在8位处理器上使用(实际上在20世纪80年代经常使用)。虽然必须分四步执行长加法有些烦人,但即使数字不超过16777215,能够操作单个数量的便利性也值得使用四步而不是三步所带来的性能损失。使用8字节类型的情况要少得多。在我看来,适当的解决方法应该是将“long long”作为可选功能,至少对于独立实现来说是这样。 - supercat
1个回答

41

在 ISO C90 和 C++98 中并没有 long long 类型。这种类型直到 ISO C99 和 C++11 才被添加进来。

然而,GCC 在标准化之前就提供了这种类型的扩展支持。


20
这是一个罕见的例子,指一种 GCC 扩展功能,其语义得到保持不变并已成为标准化的特性。 - user2404501
6
@Patrick 是的,我认为这个选项存在只是因为有人决定所有由 -ansi -pedantic 启用的警告都应该用自己的 -Wfoo 选项表示。 实际上没有理由单独使用 -Wlong-long。 哦,但是 -Wno-long-long 更有意义。 - user2404501
2
@Patrick:对于那些恰好在LNG_MAX+1u和ULNG_MAX之间的十进制字面量,警告的另一个原因是,在C89中,这样的字面量被视为无符号类型,但在C99中被视为有符号类型。在LNG_MAX为2147483647且ULNG_MAX为4294967295的C89实现中,表达式4294967295==-1将产生1(因为两侧都将转换为“unsigned long”),而在C99中它将计算为0(两侧都转换为“unsigned long long”)。 - supercat
我想点个赞,但32这个数字太好了! - Galaxy
2
@Galaxy,long long 至少是 64 位的。 ;) - a3f
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接