Error: this statement may fall through [-Werror=implicit-fallthrough=]
Error: this statement may fall through [-Werror=implicit-fallthrough=]
我正在尝试在 ubuntu 上编译 mitk,但我收到了这个错误:
error: this statement may fall through [-Werror=implicit-fallthrough=]
这里有部分代码:
/** Get memory offset for a given image index */
unsigned int GetOffset(const IndexType & idx) const
{
const unsigned int * imageDims = m_ImageDataItem->m_Dimensions;
unsigned int offset = 0;
switch(VDimension)
{
case 4:
offset = offset + idx[3]*imageDims[0]*imageDims[1]*imageDims[2];
case 3:
offset = offset + idx[2]*imageDims[0]*imageDims[1];
case 2:
offset = offset + idx[0] + idx[1]*imageDims[0];
break;
}
return offset;
}
如有任何帮助,我将不胜感激。
您应该在每个 case 语句中添加关键字 break,如果您不这样做,代码将从匹配条件的 case 运行 继续满足
break;
例如:如果 VDimension = 4,则代码将从案例 4 运行 => 继续到案例 3 => 继续到案例 2 然后中断。这意味着它将执行以下命令:
offset = offset + idx[3]*imageDims[0]*imageDims[1]*imageDims[2];
offset = offset + idx[2]*imageDims[0]*imageDims[1];
offset = offset + idx[0] + idx[1]*imageDims[0];
break;
return offset;
我认为你的代码应该是:
/** Get memory offset for a given image index */
unsigned int GetOffset(const IndexType & idx) const
{
const unsigned int * imageDims = m_ImageDataItem->m_Dimensions;
unsigned int offset = 0;
switch(VDimension)
{
case 4:
offset = offset + idx[3]*imageDims[0]*imageDims[1]*imageDims[2];
break;
case 3:
offset = offset + idx[2]*imageDims[0]*imageDims[1];
break;
case 2:
offset = offset + idx[0] + idx[1]*imageDims[0];
break;
}
return offset;
}
默认情况下,Switch case 语句会失效。在所示程序的情况下,如果 VDimension
为 4,则所有
offset = offset + idx[3]*imageDims[0]*imageDims[1]*imageDims[2];
offset = offset + idx[2]*imageDims[0]*imageDims[1];
offset = offset + idx[0] + idx[1]*imageDims[0];
将被处决
其他一些语言,比如Pascal,只执行一个case,没有fall through的概念。因此,刚接触 C++ 的程序员可能会无意中编写 fall through switches。
如果掉线是无意的,您需要在每个案例之间添加一个中断以防止掉线。
this statement may fall through
此警告通知程序员有关失败的信息。这个警告选项可以用 GCC 编译器开关 -Wimplicit-fallthrough
来控制。默认不启用,-Wall
不启用,但-Wextra
启用。
如果使用 -Werror
开关,警告会变成错误。 -Werror
默认不启用。
C++17 引入了 [[fallthrough]]
属性,可用于在有意时明确记录失败。如果使用,编译器应该不会警告:
switch(VDimension)
{
case 4:
offset = offset + idx[3]*imageDims[0]*imageDims[1]*imageDims[2];
[[fallthrough]];
case 3:
offset = offset + idx[2]*imageDims[0]*imageDims[1];
[[fallthrough]];
case 2:
offset = offset + idx[0] + idx[1]*imageDims[0];
break;
}
在 C++17 之前,GCC 提供了语言扩展属性 __attribute__ ((fallthrough))
用于相同目的。
失败也可以用注释记录下来,Wimplicit-fallthrough
可能会根据开关使用的值检测到此类注释。 GCC 文档中的更多详细信息。
如果您完全确定这些警告无关紧要,请在编译期间删除 -Werror
标志。
对于在配置阶段放置标志的项目,您可以这样做
./configure --disable-werror
之前 运行
make
我正在尝试在 ubuntu 上编译 mitk,但我收到了这个错误:
error: this statement may fall through [-Werror=implicit-fallthrough=]
这里有部分代码:
/** Get memory offset for a given image index */
unsigned int GetOffset(const IndexType & idx) const
{
const unsigned int * imageDims = m_ImageDataItem->m_Dimensions;
unsigned int offset = 0;
switch(VDimension)
{
case 4:
offset = offset + idx[3]*imageDims[0]*imageDims[1]*imageDims[2];
case 3:
offset = offset + idx[2]*imageDims[0]*imageDims[1];
case 2:
offset = offset + idx[0] + idx[1]*imageDims[0];
break;
}
return offset;
}
如有任何帮助,我将不胜感激。
您应该在每个 case 语句中添加关键字 break,如果您不这样做,代码将从匹配条件的 case 运行 继续满足
break;
例如:如果 VDimension = 4,则代码将从案例 4 运行 => 继续到案例 3 => 继续到案例 2 然后中断。这意味着它将执行以下命令:
offset = offset + idx[3]*imageDims[0]*imageDims[1]*imageDims[2];
offset = offset + idx[2]*imageDims[0]*imageDims[1];
offset = offset + idx[0] + idx[1]*imageDims[0];
break;
return offset;
我认为你的代码应该是:
/** Get memory offset for a given image index */
unsigned int GetOffset(const IndexType & idx) const
{
const unsigned int * imageDims = m_ImageDataItem->m_Dimensions;
unsigned int offset = 0;
switch(VDimension)
{
case 4:
offset = offset + idx[3]*imageDims[0]*imageDims[1]*imageDims[2];
break;
case 3:
offset = offset + idx[2]*imageDims[0]*imageDims[1];
break;
case 2:
offset = offset + idx[0] + idx[1]*imageDims[0];
break;
}
return offset;
}
默认情况下,Switch case 语句会失效。在所示程序的情况下,如果 VDimension
为 4,则所有
offset = offset + idx[3]*imageDims[0]*imageDims[1]*imageDims[2];
offset = offset + idx[2]*imageDims[0]*imageDims[1];
offset = offset + idx[0] + idx[1]*imageDims[0];
将被处决
其他一些语言,比如Pascal,只执行一个case,没有fall through的概念。因此,刚接触 C++ 的程序员可能会无意中编写 fall through switches。
如果掉线是无意的,您需要在每个案例之间添加一个中断以防止掉线。
this statement may fall through
此警告通知程序员有关失败的信息。这个警告选项可以用 GCC 编译器开关 -Wimplicit-fallthrough
来控制。默认不启用,-Wall
不启用,但-Wextra
启用。
如果使用 -Werror
开关,警告会变成错误。 -Werror
默认不启用。
C++17 引入了 [[fallthrough]]
属性,可用于在有意时明确记录失败。如果使用,编译器应该不会警告:
switch(VDimension)
{
case 4:
offset = offset + idx[3]*imageDims[0]*imageDims[1]*imageDims[2];
[[fallthrough]];
case 3:
offset = offset + idx[2]*imageDims[0]*imageDims[1];
[[fallthrough]];
case 2:
offset = offset + idx[0] + idx[1]*imageDims[0];
break;
}
在 C++17 之前,GCC 提供了语言扩展属性 __attribute__ ((fallthrough))
用于相同目的。
失败也可以用注释记录下来,Wimplicit-fallthrough
可能会根据开关使用的值检测到此类注释。 GCC 文档中的更多详细信息。
如果您完全确定这些警告无关紧要,请在编译期间删除 -Werror
标志。
对于在配置阶段放置标志的项目,您可以这样做
./configure --disable-werror
之前 运行
make