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

wlwcrazw  于 2023-02-26  发布在  其他
关注(0)|答案(2)|浏览(119)

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

当使用枚举值作为语句的case时,语句 * 总是 * 命中default子句。如果我用枚举值替换它们所表示的整数(即case 0: ... case 1: ...),则语句按预期运行。
当在语句中使用枚举值时,我尝试将枚举数引用为执行切换的值:

switch ((LED_References_e)led)

但这也是每次都默认的。
我在我的程序中使用了另一个枚举器,这个枚举器功能正常,但是它是使用if/else而不是switch/case进行有条件测试的。
我有两个问题:
1.为什么switch/case语句看起来不适用于枚举值?
1.我忽略了if/elseswitch/case之间的哪些根本区别?

ewm0tg9j

ewm0tg9j1#

假设Max Langhof是正确的,并且在交换机的作用域中还有其他名称ALLLED1等,因此LED_References_e的名称被隐藏,这应该会有所帮助:
我不能100%确定标准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_References_e枚举中的LED1 ... LED4,如果在同一个作用域中还有其他的LEDx,这应该可以消除歧义。

sgtfey8w

sgtfey8w2#

enum LED_References_e {
  ALL  = 0,
  LED1 = 1,
  LED2 = 2,
  LED3 = 3,
  LED4 = 4
};

Void led(LED_References_e 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;

  }
}

相关问题