web-dev-qa-db-fra.com

avertissement c ++: valeur d'énumération non gérée dans le commutateur [-Wswitch]

J'essaie de compiler le code suivant sans avertissements:

    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;
    }

cependant, je reçois beaucoup d'avertissements:

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

Ce qui en moi n'est pas un problème, car je n'ai pas besoin de gérer tous les types d'événements.

Ajouter

default:
    break;

à mon code supprime les avertissements, mais est-ce le meilleur moyen de résoudre ce problème?

18
bluszcz

Soyez explicite

Cela dépend de ce que vous essayez de réaliser. La règle générale est

Il vaut mieux être explicite.

L'omission des étuis donne simplement l'impression que vous en avez oublié. Être explicite garantit aux lecteurs suivants de votre code que vous destiné à ne rien faire pour certains événements.

À la lumière de cela, vous avez deux options:

Option 1 - ajouter la valeur par défaut

default:
  break;

Cela supprime l'avertissement et indique clairement que vous n'avez pas l'intention de gérer les autres types d'événements ici.

Option 2 - répertoriez chaque valeur

Répertoriez chaque type d'événement, suivi d'un break. Ceci est également explicite et a l'avantage supplémentaire que, si vous ajoutez un type d'événement, le compilateur vous avertira à nouveau que votre switch est incomplet. Cela peut être utile lorsque vous avez de nombreuses instructions switch, dont certaines doivent être modifiées pour faire quelque chose de nouveau lorsqu'une valeur enum est ajoutée.

Qu'en est-il d'une série d'instructions if?

Je ne recommanderais pas d'utiliser une série d'instructions if ici. Un switch est plus clair, réduit la quantité de frappe et (comme vous l'avez vu) peut produire de meilleurs avertissements du compilateur pour les cas que vous avez omis.

32
Andrew