如何按标准迭代枚举

How to iterate over enums, by standard?

本文关键字:枚举 迭代 标准 何按      更新时间:2023-10-16

我在谷歌上搜索如何迭代枚举,我发现了各种各样的建议,比如如何迭代枚举?虽然可以,所有这些方法都必须回到迭代整数,但我发现建议的解决方案或多或少是一种黑客攻击。为什么不能更好地支持此操作,是否有更深层次的原因?还是从另一边看,哪一个更便携(包括C和C++之间的一个)和更标准?

要遍历在 C 和 C++ 之间可移植的通用枚举,只需使用查找表:

typedef enum
{
  hello = 123,
  world = 456
} hello_t;
const hello_t TABLE [ENUM_ITEMS] =
{
  hello,
  world
};
for(size_t i=0; i<ENUM_ITEMS; i++)
{
  printf("%d", (int)TABLE[i]);
}

不幸的是,没有办法以编程方式获取常量ENUM_ITEMS,除非你有一个没有分配值的非特定枚举,如enum { hello, world, ENUM_ITEMS }。如果某些枚举常量是显式分配的数字,那么您只能做这样的事情:

typedef enum
{
  ENUM_START = __LINE__,
  hello = 123,
  world = 456,
  ENUM_ITEMS = __LINE__ - ENUM_START - 1
} hello_t;

C 还是 C++ ?这不是一回事。

你不能在 C 中迭代枚举,因为枚举只是在编译时被那里的编号切换。但是,如果您确定枚举中的内容,则可以"迭代",如下所示:

enum color {
  YELLOW,
  GREEN,
  BLUE,
  RED,
  /* Please, add new color BEFORE this comment */
  NB_COLOR
};
for (int i = 0; i < NB_COLOR; ++i) {
   /* Do something */
}

但正如你所说,这更像是一个黑客,因为你无法确定你的枚举是否以 0 开头,也无法确定 C 中的枚举之间没有"空槽"。