【发布时间】:2012-10-20 02:58:15
【问题描述】:
我得到:
警告:假设 (X + c)
在这一行:
if ( this->m_PositionIndex[in] < this->m_EndIndex[in] )
m_PositionIndex 和 m_EndIndex 类型为 itk::Index (http://www.itk.org/Doxygen/html/classitk_1_1Index.html),它们的 operator[] 返回一个 signed long。
(这里是第 37 行:https://github.com/Kitware/ITK/blob/master/Modules/Core/Common/include/itkImageRegionConstIteratorWithIndex.hxx 用于上下文)
任何人都可以在这里解释导致该警告的原因吗?我在任何地方都看不到 (x+c) < x 模式 - 因为这只是 signed long 比较。
我试图在一个独立的例子中重现它:
#include <iostream>
namespace itk
{
struct Index
{
signed long data[2];
Index()
{
data[0] = 0;
data[1] = 0;
}
signed long& operator[](unsigned int i)
{
return data[i];
}
};
}
int main (int argc, char *argv[])
{
itk::Index positionIndex;
itk::Index endIndex;
for(unsigned int i = 0; i < 2; i++)
{
positionIndex[i]++;
if ( positionIndex[i] < endIndex[i] )
{
std::cout << "something" << std::endl;
}
}
return 0;
}
但我没有收到警告。关于我的演示和真实代码之间有什么不同的想法,或者是什么可能导致真实代码中的警告?我收到带有 -Wall 标志的 gcc 4.7.0 和 4.7.2 的警告。
【问题讨论】:
-
当您编译您的演示时,您是否使用了相同的优化级别?
-fstrict-overflow或-O2(或更高版本) -
@DaveS - 是的,我在两种情况下都使用 -O3 -Wall 进行编译。
-
看看使用这个
operator++的“实例化”函数的反汇编可能会很有趣。
标签: c++ gcc gcc-warning