web-dev-qa-db-ja.com

c ++警告:列挙値はスイッチで処理されません[-Wswitch]

警告なしで次のコードをコンパイルしようとしています:

    while (window.pollEvent(event))
    {
        switch (event.type) {
            case sf::Event::Closed:
                window.close(); break;
            case sf::Event::KeyPressed:
                if(event.key.code == sf::Keyboard::Escape )
                    window.close();
                if( sf::Keyboard::isKeyPressed( sf::Keyboard::Space ) )
                    particleSystem.fuel( 200/* * window.getFrameTime() */);
                if( sf::Keyboard::isKeyPressed( sf::Keyboard::A ) )
                    particleSystem.setPosition( --xpos, ypos );
                if( sf::Keyboard::isKeyPressed( sf::Keyboard::D ) )
                    particleSystem.setPosition( ++xpos, ypos );
                if( sf::Keyboard::isKeyPressed( sf::Keyboard::W ) )
                    particleSystem.setPosition( xpos, --ypos );
                if( sf::Keyboard::isKeyPressed( sf::Keyboard::S ) )
                    particleSystem.setPosition( xpos, ++ypos );
                if( sf::Keyboard::isKeyPressed( sf::Keyboard::Left ) )
                    particleSystem.setGravity( --xgrv * 0.1f, ygrv * 0.1f);
                if( sf::Keyboard::isKeyPressed( sf::Keyboard::Right ) )
                    particleSystem.setGravity( ++xgrv * 0.1f, ygrv * 0.1f );
                if( sf::Keyboard::isKeyPressed( sf::Keyboard::Up ) )
                    particleSystem.setGravity( xgrv * 0.1f, --ygrv * 0.1f );
                if( sf::Keyboard::isKeyPressed( sf::Keyboard::Down ) )
                    particleSystem.setGravity( xgrv * 0.1f, ++ygrv * 0.1f );
                if( sf::Keyboard::isKeyPressed( sf::Keyboard::G ) )
                    particleSystem.setGravity( 0.0f, 0.0f );
                if( sf::Keyboard::isKeyPressed( sf::Keyboard::P ) )
                    particleSystem.setPosition( 320.0f, 240.0f );
                break;
    }

ただし、多くの警告が表示されます。

/home/bluszcz/private/repo/deerportal/game.cpp:444: warning: enumeration value 'LostFocus' not handled in switch [-Wswitch]

私の場合、これは問題ではありません。すべてのタイプのイベントを処理する必要がないからです。

追加中

default:
    break;

私のコードに警告を削除しますが、この問題を解決する最良の方法ですか?

18
bluszcz

明示する

それはあなたが達成しようとしているものに依存します。支配規則は

明示的にする方が良いです。

ケースを省略すると、単に忘れているように見えます。明示的であることは、コードの後続の読者に、特定のイベントに対して何もしない意図であることを保証します。

その観点から、いくつかのオプションがあります。

オプション1-デフォルトを追加

default:
  break;

これにより、警告が抑制され、ここで他のイベントタイプを処理するつもりがないことが明確になります。

オプション2-各値をリストする

各イベントタイプをリストし、その後にbreakを続けます。これも明示的であり、イベントタイプを追加した場合、コンパイラはswitchが不完全であることを再度警告します。これは、多くのswitchステートメントがあり、enum値が追加されたときに新しい操作を行うために一部を変更する必要がある場合に役立ちます。

一連のifステートメントはどうですか?

ここで一連のifステートメントを使用することはお勧めしません。 switchはより明確で、入力の量を減らし、(お分かりのように)省略した場合により良いコンパイラ警告を生成できます。

32
Andrew