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 などの他の一部の言語では、1 つのケースのみが実行され、フォール スルーの概念はありません。そのため、C++ を初めて使用するプログラマーは、意図せずフォール スルー スイッチを作成する可能性があります。

フォール スルーが意図的でない場合は、フォール スルーしないように、各ケースの間にブレークを追加する必要があります。

このステートメントは失敗する可能性があります

この警告は、フォールスルーについてプログラマーに通知します。この警告オプションは、GCC コンパイラ スイッチで制御できます-Wimplicit-fallthrough。デフォルトでは有効化されておらず、 によっても有効化されていませんが、 によって有効化さ-Wallれてい-Wextraます。

-Werrorスイッチを使用すると警告がエラーになります。-Werrorデフォルトでは有効になっていません。

C++17[[fallthrough]]で属性が導入されました。これは、意図的なフォール スルーを明示的に文書化するために使用できます。使用されている場合、コンパイラは警告しません。

C++17 より前では、GCC は__attribute__ ((fallthrough))同じ目的で言語拡張属性を提供しています。

フォールスルーはコメントで文書化することもできWimplicit-fallthrough、スイッチで使用された値に応じてそのようなコメントを検出する場合があります。詳細については、GCC のドキュメントを参照してください。

于 2019-04-15T16:13:50.203 に答える