C++ 为什么我的开关/案例在使用枚举时是默认的?

C++ 为什么我的开关/案例在使用枚举时是默认的?,c++,arduino,C++,Arduino,我在Arduino 1.8.7中有以下switch/case语句,其中变量led是一个整数: switch (led) { case ALL: { /* do stuff */ break; } case LED1: { /* do stuff */ break; } case LED2: { /* do stuff */ break; } case LED3: { /* do stuff */

我在Arduino 1.8.7中有以下
switch/case
语句,其中变量
led
是一个整数:

switch (led) {

  case ALL: {
    /* do stuff */
    break;
  }

  case LED1: {
    /* do stuff */
    break;
  }

  case LED2: {
    /* do stuff */
    break;
  }

  case LED3: {
    /* do stuff */
    break;
  }

  case LED4: {
    /* do stuff */
    break;
  }

  default: {
    break;
  }

}
我还有以下
enum

enum LED_References_e
{
  ALL  = 0,
  LED1 = 1,
  LED2 = 2,
  LED3 = 3,
  LED4 = 4
};
当使用枚举值作为语句的实例时,语句总是命中
default
子句。如果我用枚举值替换它们所表示的整数(即
情况0:…情况1:…
),则语句将按预期运行

在语句中使用枚举值时,我尝试引用枚举数作为执行切换的值:

switch ((LED_References_e)led)
但这也是每次都默认的

我正在我的程序中使用另一个枚举器,该枚举器功能正常,但是它是使用
if/else
而不是
switch/case
进行有条件测试的

我的问题有两个:

  • 为什么
    switch/case
    语句似乎不适用于枚举值
  • if/else
    switch/case
    之间,我缺少什么基本区别

  • 假设Max Langhof是正确的,并且还有其他名称
    ALL
    LED1
    ,等等。。。在开关的作用域中,使
    LED\u参考
    参考隐藏,这应有助于:

    我对标准C++和ARDUINO C++的区别不太确定,但你应该能做到以下几点:

    enum LED_References_e
    {
      ALL  = 0,
      LED1 = 1,
      LED2 = 2,
      LED3 = 3,
      LED4 = 4
    };
    
    switch (led) {
    
      case LED_References_e::ALL: {
        /* do stuff */
        break;
      }
    
      case LED_References_e::LED1: {
        /* do stuff */
        break;
      }
    
      case LED_References_e::LED2: {
        /* do stuff */
        break;
      }
    
      case LED_References_e::LED3: {
        /* do stuff */
        break;
      }
    
      case LED_References_e::LED4: {
        /* do stuff */
        break;
      }
    
      default: {
        break;
      }
    
    }
    
    它的作用是告诉编译器您明确希望从
    LED\u引用\u e
    enum中获取
    LED1
    ..
    LED4

    如果在同一范围内有其他
    LEDx
    e,则应消除歧义。

    开关处的范围内可能有其他名称
    ALL
    LED1
    等,因此
    LED\u参考值不可见。您能否生成一个表达式,以便我们进一步研究它?带有枚举的Switch语句工作正常。问题出在代码的其他地方。如果您有C++11,请为LED_引用使用enum类。@Peterderman您是对的,我正在导入的另一个模块中使用了同名常量。谢谢你鼓励我去别处看看;应该会有一些编译器警告,但是嘿,呵呵@AdamMitchell这不是编译器警告,因为来自不同作用域的名称阴影通常不是无意的()。这尤其是使用
    enum class
    的一个很好的理由——如果其他值的类型一开始就不正确,那么就不会发生这些意外。