我正在尝试编译以下代码而不发出警告:
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;
我的代码删除了警告,但这是解决此问题的最佳方法吗?
答案 0 :(得分:30)
这取决于你想要达到的目标。管理规则是
最好是明确的。
省略案例只会让你看起来忘了一些。明确保证您的代码的后续读者您意图对某些事件不做任何事。
鉴于此,您有几个选择:
default:
break;
这会抑制警告,并明确表示您不打算在此处理其他事件类型。
列出每个事件类型,然后是break
。
这也是明确的,并且还有额外的好处,如果您添加事件类型,编译器将再次警告您switch
不完整。当你有许多switch语句时,这很有价值,其中一些语句需要修改,以便在添加枚举值时做一些新的事情。
我不建议在这里使用一系列if
语句。 switch
更清晰,减少了输入量,并且(如您所见)可以为您省略的情况产生更好的编译器警告。