为什么我的开关/机箱在使用枚举时默认?
Why does my switch/case default when using enums?
我在 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;
}
}
相关文章:
- 为什么我的开关/机箱在使用枚举时默认?
- 如何使用默认值将枚举声明为 extern
- 如何使用默认值为构造函数中的枚举赋值?
- 如何使用 pybind11 提供默认枚举值?
- 正向声明的枚举,默认值以.h为单位
- 枚举类默认整数值
- 为什么C++不为枚举类型提供默认"operator>>"函数?
- C++ 在C++中通过引用将枚举作为默认参数传递时出错
- 是否有C++准则将第一个枚举设置为"safe"默认值?
- 为什么作用域枚举默认支持运算符'<'?
- C++枚举的规范是默认可构造的
- 枚举类默认初始化
- 可以将枚举的默认类型设置为无符号字符
- 位掩码作为具有默认参数的成员枚举
- 未初始化的枚举器默认值
- C++中默认初始化的全局强类型枚举是什么
- OpenGL红皮书-如果枚举默认为整数,从0开始,glBindVertexArray如何绑定到保留值0
- 如何更改Boost.Serialization中的默认枚举序列化
- 在成员函数的默认参数中使用强类型枚举的成员
- 在类中声明的枚举的默认值