错误:此语句可能会通过 \[-Werror=implicit-fallthrough=\]

新手上路,请多包涵

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

如有任何帮助,我将不胜感激。

原文由 agasim 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 956
2 个回答

您应该在每个 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;
  }

原文由 the boy 发布,翻译遵循 CC BY-SA 4.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,只执行一个 case,并且没有 fall through 的概念。因此,刚接触 C++ 的程序员可能会无意中通过 switch 编写代码。

如果跌倒是无意的,您需要在每个案例之间添加一个中断以不跌倒。

这种说法可能会落空

此警告通知程序员有关失败的信息。可以使用 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 的文档中。

原文由 eerorika 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题