我遇到了来自gcc 4.1.2的以下警告:
warning: comparison is always false due to limited range of data type
有关的C代码是这样的:
if ( unlikely(count < 0) ) BUG();
“计数”是无符号的。
我试图禁用警告,因为我不允许修改源代码:
-Wno-type-limits
但似乎gcc 4.1.2不支持它。
cc1: error: unrecognized command line option "-Wno-type-limits"
任何其他方式摆脱这个警告?
一个unsigned
值永远不会是负面的,因此警告。 这不太“不可能”和“不可能”。
这通常表示在某种代码中存在一个错误; 代码被写为期望可以允许负值的类型,但是该类型不允许负值。 所以,代码很可能会因为期望的不匹配而不合适。
请注意,在某些计算机上,普通char
是被签名的,其他符号是无符号的(并且它是一种与signed char
和unsigned char
不同的类型,尽管它的值范围与其中一个或另一个重叠)。
取决于源代码的年代,可以用防御性的方式写一段时间,因为编译器现在不像gcc那样类型安全。
警告看起来像是-Wextra(又名-W)警告选项集的一部分,所以如果你想要额外的警告,那将是其中之一。 我个人使用 – 墙,相信与否不包括“额外”的东西。 你会认为“全部”会包括“额外”,但我猜不是…
比较中使用的变量被声明为8位无符号整数。当我将其更改为32位无符号整数时,警告被删除。 旧的:uint8_t变量= 0; 修复:uint32_t变量= 0;
修复此警告的选项:
除去真实的情况
最好:除去真正的条件+添加static_assert,以确保类型是无符号的。 (对于C版本的static_assert看看这里 )
对于gcc 4.3之前的版本:删除编译器选项:-Wextra
对于gcc 4.3+添加选项:-Wno-type-limits