c - 在 C 中,如何循环每个没有连续值的枚举文字

标签 c for-loop literals

假设我有以下枚举文字

enum
{
valueA = 5,
valueB = 7,
valueC = 9,
valueD = 14,
valueE = 15
}myEnumType; 

我想遍历每个文字 例如

for (enumType myValEnum = valueA; myValEnum <= valueE; myValEnum++)
{
    MyFunction(mValEnum);
}

这行得通吗,或者我最终会用值 5,6,7,8,9,10,11,12,13,14,15 调用 MyFunction 吗?

最佳答案

你不能那样做,在 C 中不支持对枚举进行“foreach”类型的迭代。基本上,枚举只是别名整数,几乎没有额外支持。

您需要使用一个映射表,它允许您将连续的索引映射到枚举类型的值:

static const myEnumType myEnumMap[] = { valueA, valueB, valueC, valueD, valueE};

然后您可以对该数组使用普通循环:

for(size_t i = 0; i < sizeof myEnumMap / sizeof *myEnumMap; ++i)
{
  const myEnumType ie = myEnumMap[i];
  /* process ie */
}

请注意,myEnumMap 的类型是您的枚举类型,它不是普通的“整数数组”。

这有一个缺点,即需要枚举枚举两次(一次在它自己的定义中,然后在 myEnumMap 初始值设定项中)。可以使用宏技巧(例如 X macros )来解决这个问题,但没有真正方便/容易的方法来做到这一点。

关于c - 在 C 中,如何循环每个没有连续值的枚举文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20993142/

相关文章:

python - 0o777 作为 mkdir 模式值的含义是什么?

c - 指针变量在内存中是如何分配的?内存分配是否取决于数据类型?

C、将外部文本插入文本文件,

arrays - 如何在 Rust 的全局范围内指定 const 数组?

c++ - 为什么我不能访问 openCV 中的矩阵元素?

javascript - 事件监听器在 javascript 中无法正常工作

c - C 编程中的循环练习

将多个 pdf 文件数据复制到不同工作表中的 Excel

c - for 循环添加先前循环的结果