c++ avertissement: valeur de l'énumération n'est pas traité de switch [-Wswitch]
Je suis en train de compiler code suivant sans mise en garde:
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 de mises en garde:
/home/bluszcz/private/repo/deerportal/game.cpp:444: warning: enumeration value 'LostFocus' not handled in switch [-Wswitch]
Qui, à mon il n'est pas un problème, depuis que je suis n'a pas besoin de la manipulation de tous types d'événements.
Ajoutant
default:
break;
à mon code supprime les mises en garde, cependant est-il une meilleure façon de résoudre ce problème?
Je pense que
Vous devriez toujours avoir un cas de défaut dans le cas où il n'y a pas de match.
Personnellement, je crois que cet avertissement (en collaboration avec la réorganisation de membre d'initialisation dans le constructeur) est l'un des moins utile dans gcc. J'avais des tonnes de cas où toutes les valeurs de l'enum avait un véritable cas de commutateurs et de faire un vide par défaut juste pour pacifier le compilateur est dénué de sens, la syntaxe de bruit. C'est pourquoi cet avertissement, c'est celui que je suis OK avec la suppression de.
Je suis en désaccord. Bien sûr, il ya des cas où un
default
est encore la meilleure façon, vous pouvez toujours traiter chaque cas séparément si vous le souhaitez.Vous devriez toujours avoir un cas de défaut dans le cas où il n'y a pas de match.
Personnellement, je crois que cet avertissement (en collaboration avec la réorganisation de membre d'initialisation dans le constructeur) est l'un des moins utile dans gcc. J'avais des tonnes de cas où toutes les valeurs de l'enum avait un véritable cas de commutateurs et de faire un vide par défaut juste pour pacifier le compilateur est dénué de sens, la syntaxe de bruit. C'est pourquoi cet avertissement, c'est celui que je suis OK avec la suppression de.
Je suis en désaccord. Bien sûr, il ya des cas où un
default:
cas est appropriée. Mais dans le cas général, vous devriez éviter et de traiter tous de manière explicite les valeurs de sorte que le compilateur peut vous avertir lorsque vous avez oublié de s'occuper d'une affaire.
OriginalL'auteur bluszcz | 2016-05-16
Vous devez vous connecter pour publier un commentaire.
Être explicite
Cela dépend de ce que vous essayez d'atteindre. Le conseil règle est
En omettant le cas, le simple fait ressembler vous avez oublié certains. Être plus explicite assure ultérieure lecteurs de votre code que vous prévu de ne rien faire pour certains événements.
À la lumière de cela, vous avez deux options:
Option 1 - pour ajouter de la valeur par défaut
Cela supprime l'avertissement, et il est clair que vous n'avez pas l'intention de gérer les autres types d'événements ici.
Option 2 - liste de chaque valeur
Liste de chaque type d'événement, suivi par un
break
.C'est aussi explicite, et a l'avantage d'être, vous ne devez jamais ajouter un type d'événement, le compilateur va encore une fois vous avertir que votre
switch
est incomplète. Cela peut être utile lorsque vous avez plusieurs états, dont certains doivent être modifiés pour faire quelque chose de nouveau quand une valeur d'enum est ajouté.À propos d'une série de if?
Je ne recommande pas l'utilisation d'une série de
if
déclarations ici. Unswitch
est plus clair, réduit la quantité de taper, et (comme vous l'avez vu) peut produire de meilleurs avertissements du compilateur pour les cas vous avez omis.L'Option 1 a fait le travail pour moi!
OriginalL'auteur Andrew