c ++警告:交换机中未处理枚举值[-Wswitch]

blu*_*zcz 18 c++ warnings compiler-warnings switch-statement

我试图在没有警告的情况下编译以下代码:

    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;
    }
Run Code Online (Sandbox Code Playgroud)

但是,我收到了很多警告:

/home/bluszcz/private/repo/deerportal/game.cpp:444: warning: enumeration value 'LostFocus' not handled in switch [-Wswitch]
Run Code Online (Sandbox Code Playgroud)

在我这不是一个问题,因为我不需要处理所有类型的事件.

添加

default:
    break;
Run Code Online (Sandbox Code Playgroud)

我的代码删除警告,但它是解决此问题的最佳方法吗?

And*_*rew 32

要明确

这取决于你想要达到的目标.治理规则是

最好是明确的.

省略这些案件只会让你看起来像忘了一些.明确向后续的代码读者保证,您打算不对某些事件做任何事情.

鉴于此,您有几个选择:

选项1 - 添加默认值

default:
  break;
Run Code Online (Sandbox Code Playgroud)

这会抑制警告,并明确表示您不打算在此处理其他事件类型.

选项2 - 列出每个值

列出每个事件类型,然后是a break.这也是明确的,并且有额外的好处,如果您添加事件类型,编译器将再次警告您,您switch的不完整.当你有许多switch语句时,这可能是有价值的,当添加枚举值时,其中一些需要被修改以执行新的操作.

一系列if语句怎么样?

我不建议if在这里使用一系列的陈述.A switch更清晰,减少了打字量,并且(正如您所见)可以为您省略的情况产生更好的编译器警告.