gpt4 book ai didi

c - 如何仅迭代直接在普通 c 中设置枚举值?

转载 作者:行者123 更新时间:2023-12-02 01:53:41 26 4
gpt4 key购买 nike

我有一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com