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

标签 c enums

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

相关文章:

scala - 通过 scala 或 java 中的继承扩展一组命名值

c - 将二进制值存储在 C 中的数组中

跨不同文件创建新的全局变量就是扩展同一个变量

java - 为什么使用枚举而不是常量?在软件设计和可读性方面哪个更好

java - 强制穷举开关

c# - 为什么在枚举内声明位域的组合会产生与在枚举外声明不同的结果?

c++ - 在类中使用枚举时,它会是公开的吗?为什么?

c - 删除列表中唯一的值后显示列表时出现错误处理中断

c++ - 为 C/C++ 中的项目的 makefile 生成依赖项

c - 在 Eclipse 中编译 C 语言凯撒密码时遇到困难