我正在尝试在ubuntu上编译mitk,但出现此错误:
错误:该语句可能会出现[-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;
}
请给我任何帮助。
答案 0 :(得分:0)
您应该在每个case语句中添加关键字break,否则,代码将从符合条件的case开始运行,并继续满足
休息;
例如:如果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;
}
答案 1 :(得分:0)
默认情况下,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)中,仅执行一种情况,并且没有掉线的概念。因此,刚接触C ++的程序员可能会无意间通过开关编写代码。
如果意外落空,则需要在每种情况之间添加一个间隔以防止落空。
此陈述可能会失败
此警告通知程序员有关失败的信息。可以使用GCC编译器开关-Wimplicit-fallthrough
控制此警告选项。默认情况下未启用它,-Wall
也未启用它,但-Wextra
则启用了它。
如果使用-Werror
开关,警告将变为错误。 -Werror
默认未启用。
C ++ 17引入了[[fallthrough]]
属性,该警告可用于在有意的情况下明确记录掉线。如果使用编译器,则不应发出警告。
在C ++ 17之前,GCC为此目的提供了语言扩展属性__attribute__ ((fallthrough))
。
也可以在注释中记录掉落,并且Wimplicit-fallthrough
可能会检测到此类注释,具体取决于开关使用的值。在GCC文档中有更多详细信息。
答案 2 :(得分:0)
如果您完全确定警告是无关紧要的,请在编译过程中删除-Werror
标志。
对于在配置阶段添加标记的项目,您可以这样做
./configure --disable-werror
运行前
make