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