Ошибка: это утверждение может быть пропущено через [-Werror = implicit-fallthrough =] - PullRequest
2 голосов
/ 15 апреля 2019

Я пытаюсь скомпилировать mitk в Ubuntu, и я получил эту ошибку:

ошибка: этот оператор может не работать [-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;
      }

Буду признателен за любую помощь, пожалуйста.

Ответы [ 2 ]

0 голосов
/ 15 апреля 2019

Операторы переключения регистра по умолчанию будут сброшены В случае показанной программы, если 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];

будет выполнено.

В некоторых других языках, таких как Паскаль, выполняется только один случай, и концепция провала отсутствует. Таким образом, программисты, плохо знакомые с C ++, могут непреднамеренно писать ошибки при переключении.

Если провал непреднамеренный, вам нужно добавить разрыв между каждым случаем, чтобы не провалиться.

это утверждение может провалиться

Это предупреждение уведомляет программиста о провале. Эта опция предупреждения может управляться переключателем компилятора GCC -Wimplicit-fallthrough. Он не включен по умолчанию и не включен -Wall, но включен -Wextra.

Предупреждения становятся ошибками, если используется переключатель -Werror. -Werror по умолчанию не включено.

C ++ 17 представил атрибут [[fallthrough]], предупреждение которого можно использовать для явного документирования провала, когда оно сделано преднамеренно. Компилятор не должен предупреждать, если он используется.

До C ++ 17 GCC предоставляет атрибут расширения языка __attribute__ ((fallthrough)) для той же цели.

Падение также может быть задокументировано с комментарием, и Wimplicit-fallthrough может обнаружить такой комментарий в зависимости от того, какое значение было использовано с коммутатором. Более подробно в документации GCC.

0 голосов
/ 15 апреля 2019

Вы должны добавить ключевое слово 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;
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...