2010-08-30 104 views
2

编译我C++代码我使用-W标志,这将导致警告:克++警告:无符号表达<0的比较结果为总是假

警告:无符号表达< 0的比较结果为总是假

我相信,这被认为是一个错误,被固定在版本的GCC 4.3,但我使用这显然冒犯这里GCC 4.1

代码:

void FieldGroup::generateCreateMessage (const ApiEvent::GroupData &data, omsgstream &result) const { 
    dblog << debug; 

    // Write out the data fields we care about, in the order they were specified 
    for (size_t index = 0; index < fields.size(); ++index) { 
    size_t esIndex = clsToES[index]; 
    if (esIndex < 0 || esIndex >= data.fields.length()) { 
     ostringstream buf; 
     buf << "Invalid field " << index << " (index in ES data set " << esIndex << ", " << data.fields.length() << " fields returned)"; 
     throw InvalidDataException (buf.str()); 
    } 
    fields[index].writeData (data.fields[esIndex], result); 
    } 
} 

警告我越来越:

dbtempl.cpp:在成员函数“void ECONZ :: FIELDGROUP :: generateCreateMessage(常量新西兰::合作:: econz :: EVENTSERVER :: ApiEvent: :GroupData &,ECONZ :: omsgstream &)常量“: dbtempl.cpp:480:警告:无符号表达< 0的比较总是假

我怎么可能阻止出现这些警告?我不想删除-W标志。

+2

只是一个小小的评论:编译器可以有错误,但这些是非常罕见的。所以当编译产生警告时,首先检查你的代码**,不要认为它是编译器的错误。 – ereOn 2010-08-30 07:23:26

+0

我的不好。我有点误解了在这里找到的gnu bug报告:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23587 – nixgadgets 2010-08-30 07:28:48

+0

有趣的是:如果你比较一个无符号数量和'<0,GCC 4.5.1不会抱怨'在GCC或G ++编译器中,即使在用'-Wall'进行编辑时也是如此。它要求'-Wextra'现在生成警告。也许你应该从GCC 4.1升级到GCC 4.3或更高版本? – 2010-08-30 07:29:33

回答

16

您正在测试,如果正值低于0

一个size_t无符号,因此至少是0

这可以从未发生,编译器通过只删除测试优化的事情了。警告在这里告诉你,因为如果有人这样做,这可能是一个错误。

就你而言,你可能只是删除测试,它应该没问题。

+0

只是一个评论,因为它发生在我身上:如果你减去unsigned int,例如'unsigned int a = 3'和'unsigned int b = 4',那么由于溢出,'a-b <0'将始终为假。 – ezdazuzena 2013-02-19 09:16:03

2

Renove人物esIndex < 0 ||

这部分代码是完全没有意义的机器,这就是为什么编译器会发出警告 - “你的意思去做别的事?”。

4

size_t是一个无符号整型。因此,编译器会发现比较< 0将始终为假(标准确实在发生溢出时指定2的补码包装)。你应该进行比较,因为它是无操作的(编译器可能不会生成任何代码)。

无符号整数,声明无符号,应当服从算术模2n个的规律,其中n为整数的特定大小的值表示比特的数量 。

和相应的脚注:

46)这意味着,因为一个 结果不能由 来表示所得到的无符号整数类型是 降低模无符号 算术不会溢出一个 的数字大于 可由结果 无符号整数类型表示的最大值。

0

我该如何阻止这些警告出现?我不想删除-W标志。

:| |

只是纠正你的代码,并警告将消失...这是念头......

的警告是有帮助你产生正确的,更清洁,更高效的代码。

+4

可重用代码如何从客户端自定义头文件中绘制* const * size_t值的情况如何?在某些情况下,const值可能被设置为零(例如,音频通道的数量),并且意图是这些循环如果为零,则简单地退出编译。以不会产生编译器警告的方式编写它会很好。可以使用预处理宏代替我想... – meowsqueak 2013-04-18 23:03:04

+2

通过定义'static const unsigned ZERO = 0',您可以使用'x YoYoYonnY 2016-10-24 13:41:31

+0

@YoYoYonnY,用clang ++试过。没有这样的运气。但我很有希望。 :) 可以禁用/启用围绕比较线的警告,[这里](http://useyourloaf.com/blog/disabling-clang-compiler-warnings/)。 '#pragma clang diagnostic ignored“-Wtautological-compare” – NoahR 2016-10-25 14:54:09

相关问题