为什么使用枚举时我的开关/大小写默认?

时间:2018-10-22 15:08:59

标签: 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 */
    break;
  }

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

  default: {
    break;
  }

}

我还有以下enum

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

在将枚举值用作语句的大小写时,语句始终会命中default子句。如果我用枚举值代替它们表示的整数(即case 0: ... case 1: ...),则该语句将按预期运行。

当在语句中使用枚举值时,我尝试将枚举器引用为在其上执行切换的值:

switch ((LED_References_e)led)

但这也是每次默认设置。

我正在程序中使用另一个枚举器,并且该枚举器可以正常运行,但是使用if/else而不是switch/case对其进行了条件测试。

我的问题是双重的:

  1. 为什么switch/case语句似乎不适用于枚举值?
  2. if/elseswitch/case之间我缺少什么根本区别?

1 个答案:

答案 0 :(得分:2)

假设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;
  }

}

它的作用是告诉编译器,您明确希望从LED1枚举中LED4 ... LED_References_e。 如果同一范围内还有其他LEDx个对象,则应消除歧义。