g ++警告:无符号表达式的比较< 0总是假的

时间:2010-08-30 07:17:06

标签: c++ gcc gcc-warning

要编译我的C ++代码,我使用-W标志,这会导致警告:

  

警告:无符号表达式的比较< 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(const nz :: co :: econz :: eventServer :: ApiEvent :: GroupData&amp;,ECONZ :: omsgstream&amp;)const'中:   dbtempl.cpp:480:警告:无符号表达式的比较&lt; 0始终为假

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

4 个答案:

答案 0 :(得分:18)

您正在测试正值是否低于0.

size_t是无符号的,所以至少为0.

这可以从不发生,编译器只需删除测试即可优化。这里的警告告诉你,因为如果有人这样做,那可能是个错误。

在你的情况下,你可能只是删除测试,它应该没问题。

答案 1 :(得分:5)

size_t是无符号整数类型。因此,编译器看到比较< 0将始终为false(标准确实指定溢出时指定2的补码包装)。您应该将该比较视为无操作(并且编译器可能不会为其生成任何代码)。

  

无符号整数,声明无符号整数,应遵守算术模2n的定律,其中n是数字   特定大小整数的值表示中的位数。 46

和相应的脚注:

  

46)这意味着未签名   算术不会溢出因为a   无法表示的结果   得到的无符号整数类型是   减少模数是一个数   大于最大值   可以用结果来表示   无符号整数类型。

答案 2 :(得分:2)

删除字符esIndex < 0 ||

这部分代码对于机器来说完全没有意义,这就是编译器警告你的原因 - “你的意思是做其他的事情吗?”。

答案 3 :(得分:0)

  

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

:|

只需更正您的代码,警告就会消失......这就是想法......

警告可以帮助您生成正确,更清晰,更高效的代码。