我有一个 enum
定义在纯 c 中,如下所示:
typedef enum {
// Determine position of Red and Green color:
// RED[2:0], GREEN[5:3], BLUE implicitly. Thus, [7:6]==!0
LED_BO_RedGreenBlue=0b00010001,
LED_BO_RedBlueGreen=0b00100001,
LED_BO_GreenBlueRed=0b00001100,
LED_BO_GreenRedBlue=0b00001010,
LED_BO_BlueRedGreen=0b00100010,
LED_BO_BlueGreenRed=0b00010100,
} led_byteorder_values_t;
不幸的是,我想出的检查给定 uint8_t
是否具有在此枚举中明确定义的值的唯一方法是:
uint8_t byteToTest = 0; // has invalid value, so /default/ path will be taken.
switch (byteToTest) {
case: LED_BO_RedGreenBlue: break;
case: LED_BO_RedBlueGreen: break;
case: LED_BO_GreenBlueRed: break;
case: LED_BO_GreenRedBlue: break;
case: LED_BO_BlueRedGreen: break;
case: LED_BO_BlueGreenRed: break;
default: byteToTest = LED_BO_RedGreenBlue; break;
}
是否有更好/更短的方法来针对任意值测试变量,可能无需定义额外的 const [...]
?
最佳答案
尽管以下替代方案的吸引力并不令人心动,但它对您当前使用的平台来说仍然可能有效。
该语言不支持将 enum
值枚举作为内置结构。虽然有办法“伪造”它。一种方法是提供您自己的枚举表,然后枚举那个。但是,我会争论这是否“更好”。更容易打字,是的。合乎逻辑的,也许。但是您的 switch 语句肯定会编译成更高效的代码。如果没有,我会感到震惊。
typedef enum {
// Determine position of Red and Green color:
// RED[2:0], GREEN[5:3], BLUE implicitly. Thus, [7:6]==!0
LED_BO_RedGreenBlue=0b00010001,
LED_BO_RedBlueGreen=0b00100001,
LED_BO_GreenBlueRed=0b00001100,
LED_BO_GreenRedBlue=0b00001010,
LED_BO_BlueRedGreen=0b00100010,
LED_BO_BlueGreenRed=0b00010100,
} led_byteorder_values_t;
static const led_byteorder_values_t led_byteorder_values[] =
{
LED_BO_RedGreenBlue,
LED_BO_RedBlueGreen,
LED_BO_GreenBlueRed,
LED_BO_GreenRedBlue,
LED_BO_BlueRedGreen,
LED_BO_BlueGreenRed
};
static const size_t size_led_byteorder_values =
sizeof(led_byteorder_values)/sizeof(*led_byteorder_values);
有了它,您可以通过 [0...size_led_byteorder_values)
循环直接枚举值。您仍然可以通过调整表格条目顺序来自定义循环顺序,以实现从最有可能命中到更快的循环退出。但同样,对于像您这样的体面的开关来说,这并不是不可能的。
总之,一念之间,你的痛,我深有体会。它是不仅是 C++,而且 大多数 语言都没有提供的少数几个功能之一,而且它似乎偶尔会显得很有用。
祝你好运。
关于c - 如何仅迭代直接在普通 c 中设置枚举值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21448600/