c++警告: enumeration value not handled in switch [-Wswitch]

标签 c++ switch-statement warnings compiler-warnings

我正在尝试编译以下代码而没有警告:

    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;

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

最佳答案

明确

这取决于您要达到的目标。管理规则是

It is better to be explicit.

省略案例只会让您看起来好像忘记了一些案例。明确表明您的代码的后续读者打算对某些事件不做任何事情。

鉴于此,您有两种选择:

选项 1 - 添加默认值

default:
  break;

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

选项 2 - 列出每个值

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

一系列 if 语句呢?

我不建议在这里使用一系列 if 语句。 switch 更清晰,减少了输入量,并且(如您所见)可以为您省略的情况产生更好的编译器警告。

关于c++警告: enumeration value not handled in switch [-Wswitch],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37254496/

相关文章:

java - 如何抑制编译器警告?

java - 如何使用 String 和 Scanner 修复 Switch-case

java - 选择案例时如何跳出循环

javascript - 在 switch 语句中使用 ViewBag

c# - NHibernate 警告 Narrowing proxy to - this operation breaks ==

c++ - 导致 .exe 错误的警告?

c++ - 有没有办法在 C++ 中预定义 std::set 大小?

c++ - GMP-无模功率

c++ - 通过多线程判断每个字符在一个文件中出现了多少次

c++ - 将特征矩阵的每隔一行或每隔一列提取为一个新矩阵