12

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

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

4

3 回答 3

9

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]]属性,可用于在有意的情况下显式记录失败。如果使用它,编译器不应发出警告。

在 C++17 之前,GCC 提供了__attribute__ ((fallthrough))用于相同目的的语言扩展属性。

失败也可以用注释记录下来,并且Wimplicit-fallthrough可以根据开关使用的值来检测此类注释。更多细节在 GCC 的文档中。

于 2019-04-15T16:13:50.203 回答
4

您应该在每个 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;
  }
于 2019-04-15T16:08:32.870 回答
4

如果您绝对确定警告无关紧要,请-Werror在编译期间删除该标志。

对于在配置阶段放置标志的项目,您可以执行

./configure --disable-werror

跑步前

make

于 2020-10-10T22:56:58.443 回答