c++ advertencia: valor de enumeración no se manejan en el interruptor [-Wswitch]

Estoy tratando de compilar el siguiente código sin advertencias:

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

sin embargo, estoy recibiendo un montón de advertencias:

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

Que en mi no es un problema, ya que yo soy no necesita manejar todos los tipos de eventos.

La adición de

default:
break;

a mi código elimina las advertencias, sin embargo es una mejor manera de resolver este problema?

Creo que default es todavía la mejor manera, usted todavía puede controlar cada evento por separado si así lo desea.
Casi siempre tienen un caso de incumplimiento en caso de que no hay ninguna coincidencia.
Personalmente creo que esta advertencia (junto con la reordenación de los estados de inicialización en el constructor) es uno de los menos útiles en el gcc. Yo tenía un montón de casos en los que no todos los valores enum tenido un significativo el caso de los interruptores, y haciendo un vacío por defecto sólo para pacificar el compilador no tiene sentido sintaxis de ruido. Es por eso que esta advertencia es la que yo estoy de acuerdo con la supresión.
No estoy de acuerdo. Claro, hay casos donde un default: caso es apropiado. Pero en el caso general, se debe evitar y manejar todos los valores de forma explícita para que el compilador puede advertir a usted cuando usted se olvidó de manejar un caso.

OriginalEl autor bluszcz | 2016-05-16

1 respuesta

  1. 28

    Ser explícito

    Depende de lo que usted está tratando de lograr. El consejo de la regla es

    Es mejor ser explícito.

    La omisión de los casos, simplemente hace que se vea como usted se olvidó de algunos. Ser explícito asegura posterior a los lectores de tu código que la intención de a hacer nada para ciertos eventos.

    A la luz de eso, usted tiene un par de opciones:

    Opción 1 – agregar el valor predeterminado

    default:
    break;

    Esto suprime la advertencia, y deja en claro que no tiene intención de controlar los otros tipos de eventos aquí.

    Opción 2 – lista de cada valor

    Lista de cada tipo de evento, seguido por un break.
    Esto también es explícita, y tiene la ventaja añadida de que, si alguna vez agregar un tipo de evento, el compilador una vez más advertir que su switch es incompleta. Esto puede ser útil cuando usted tiene muchas sentencias switch, algunos de los cuales necesitan ser modificados para hacer algo nuevo cuando un valor de enumeración, se añade.

    Lo que se trata de una serie de sentencias if?

    Yo no recomendaría el uso de una serie de if declaraciones aquí. Un switch es más clara, reduce la cantidad de texto, y (como hemos visto) puede producir mejores advertencias del compilador para los casos en que se omite.

    Bonito argumentación de la Opción 2, sin embargo en mi caso simplemente donde estoy interesada sólo de los hechos particulares de manejo, creo que la Opción 1 es mi caso. Gracias.
    Opción 1 hizo el trabajo para mí!

    OriginalEl autor

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *