g++警告:无符号表达式的比较 < 0 始终为假
为了编译我的 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
标志。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
您正在测试正值是否低于 0。
size_t
是无符号的,因此至少为 0。这种情况永远不会发生,编译器只需删除测试即可优化问题。此警告是为了告诉您,因为如果有人这样做,则可能是一个错误。
对于你的情况,你可能只是删除测试,应该没问题。
You are testing if a positive value is below 0.
A
size_t
is unsigned, so at least 0.This can never happen and the compiler optimize things out by just removing the test. The warning is here to tell you because if someone does that, it might be a mistake.
In your case, you might just remove the test, it should be fine.
size_t
是无符号整数类型。因此,编译器认为比较<; 0
将始终为 false(标准确实指定了发生溢出时 2 的补码换行)。您应该去掉该比较,因为它是无操作的(并且编译器可能不会为其生成任何代码)。以及相应的脚注:
size_t
is an unsigned integral type. Hence, the compiler sees that the comparison< 0
will always be false (the Standard does specify 2's complement wrapping when overflow occurs). You should take that comparison out as it is a no-op (and the compiler will probably not generate any code for it).and the corresponding footnote:
修改字符
esIndex < 0 ||
这部分代码对机器来说完全没有意义,这就是编译器警告你的原因 - “你打算做别的事情吗?”。
Renove the characters
esIndex < 0 ||
This part of code is totally meaningless to the machine, which is why the compiler warns you - "did you mean to do something else?".
:|
只要更正你的代码,警告就会消失……这就是这个想法……
警告是为了帮助你生成正确、更干净、更高效的代码。
:|
Just correct your code and the warning will disappear ... that's the idea ...
The warnings are there to help you produce correct, cleaner, more efficient code.