为什么我的开关/机箱在使用枚举时默认?

Why does my switch/case default when using enums?

本文关键字:枚举 默认 我的 开关 机箱 为什么      更新时间:2023-10-16

我在 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之间的根本区别?

假设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,这应该消除歧义。

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