3

为了编译我的 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&, ECONZ::omsgstream&) const'中:dbtempl.cpp:480: 警告: 无符号表达式 < 0 的比较总是假的

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

4

4 回答 4

19

您正在测试一个正值是否低于 0。

Asize_t是无符号的,所以至少为 0。

永远不会发生,编译器只需删除测试即可优化。警告在这里告诉您,因为如果有人这样做,那可能是一个错误。

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

于 2010-08-30T07:19:10.910 回答
6

size_t是无符号整数类型。因此,编译器看到比较< 0总是错误的(标准确实在发生溢出时指定了 2 的补码包装)。您应该将该比较排除在外,因为它是无操作的(编译器可能不会为它生成任何代码)。

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

和相应的脚注:

46) 这意味着无符号算术不会溢出,因为不能由得到的无符号整数类型表示的结果以比得到的无符号整数类型可以表示的最大值大一的数字为模减少。

于 2010-08-30T07:21:02.653 回答
3

重新塑造人物esIndex < 0 ||

这部分代码对机器完全没有意义,这就是编译器警告你的原因——“你是不是打算做别的事情?”。

于 2010-08-30T07:19:34.603 回答
-1

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

:|

只需更正您的代码,警告就会消失……就是这样……

这些警告可以帮助您生成正确、清洁、高效的代码。

于 2010-08-30T07:27:24.103 回答