错误:此语句可能会失败[-Werror = implicit-fallthrough =]

时间:2019-04-15 15:54:42

标签: c++ gcc build gcc-warning mitk

我正在尝试在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;
      }

请给我任何帮助。

3 个答案:

答案 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