为啥gcc会有一个long long的警告?
Posted
技术标签:
【中文标题】为啥gcc会有一个long long的警告?【英文标题】:Why does gcc have a warning for long long?为什么gcc会有一个long long的警告? 【发布时间】:2016-11-25 06:24:30 【问题描述】:-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
?
我知道<stdint.h>
类型如int64_t
和朋友,但一些不太老的编译器(例如VS2005 和Green Hills ARM 3.5)不提供<stdint.h>
,我认为long long
会是(至少)64 位和更新的工具链。
【问题讨论】:
没有stdint.h
的编译器不符合C99,这意味着它们很可能根本没有long long
! (除非它们是旧版本的 GCC。)
从给出的描述看来,Patrick 的“不太老”的编译器与 90 年代的 gcc 属于同一类别 - long long
没有 stdint.h
(除了在 90 年代的大部分时间里,我们借口是 C99 还没有写出来,再加上“普通” CPU 没有 64 位整数寄存器的借口,所以基本 C 类型中缺少 64 位整数是有道理的。)跨度>
@WumpusQ.Wumbley:C 被设计为在 8 位处理器上可用(实际上在 1980 年代经常使用);必须在四个步骤中执行长时间的加法有点令人厌烦,但即使已知数字不大于 16777215,能够对单个数量进行操作的便利也值得使用四个步骤而不是三个步骤来消耗性能。使用 8 字节类型是合理的情况要少得多。恕我直言,正确的补救措施是使“long long”成为可选功能,至少对于独立实现而言。
【参考方案1】:
在 ISO C90 和 C++98 中还没有 long long
类型。仅在 ISO C99 和 C++11 中添加。
不过,GCC 在标准化之前将其作为扩展提供。
【讨论】:
...一个罕见的 gcc 扩展示例,它被标准化并具有相同的语义 因此提供此类警告的原因似乎是为了帮助确保您的代码使用非 C99 或 C++-11 兼容的编译器进行编译。 @Patrick 是的,我认为该选项之所以存在,是因为有人认为-ansi -pedantic
启用的所有警告都应由他们自己的-Wfoo
选项表示。真的没有理由单独使用-Wlong-long
。哦,但是-Wno-long-long
确实更有意义。
@WumpusQ.Wumbley 我认为没有办法专门禁用一些-pedantic
警告,例如关于多余分号的警告。不是这样吗?
@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
) .以上是关于为啥gcc会有一个long long的警告?的主要内容,如果未能解决你的问题,请参考以下文章
无法在 c 中初始化数组 |警告:从 long 转换为 long unsigned
Android Studio 警告整数乘法隐式转换为 long。如何解决这个问题?
怎么去掉Xcode工程中的某种类型的警告 Implicit conversion loses integer precision: 'NSInteger' (aka 'long