警告:由于gcc 4.1.2中的数据types范围有限,所以比较始终是错误的

我遇到了来自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 charunsigned char不同的类型,尽管它的值范围与其中一个或另一个重叠)。

取决于源代码的年代,可以用防御性的方式写一段时间,因为编译器现在不像gcc那样类型安全。

警告看起来像是-Wextra(又名-W)警告选项集的一部分,所以如果你想要额外的警告,那将是其中之一。 我个人使用 – 墙,相信与否不包括“额外”的东西。 你会认为“全部”会包括“额外”,但我猜不是…

比较中使用的变量被声明为8位无符号整数。当我将其更改为32位无符号整数时,警告被删除。 旧的:uint8_t变量= 0; 修复:uint32_t变量= 0;

修复此警告的选项:

  1. 除去真实的情况

  2. 最好:除去真正的条件+添加static_assert,以确保类型是无符号的。 (对于C版本的static_assert看看这里 )

  3. 对于gcc 4.3之前的版本:删除编译器选项:-Wextra

  4. 对于gcc 4.3+添加选项:-Wno-type-limits