我在 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
进行有条件测试的。
我的问题是双重的:
- 为什么
switch/case
语句似乎不适用于枚举值? - 我错过了
if/else
和switch/case
之间的根本区别?
假设Max Langhof是正确的,并且在交换机的范围内还有其他名称ALL
,LED1
等,以便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;
}
}