要编译我的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
标志。
答案 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标志。
:|
只需更正您的代码,警告就会消失......这就是想法......
警告可以帮助您生成正确,更清晰,更高效的代码。