循环枚举中的每个项目

时间:2011-07-05 07:35:16

标签: c

是否可以为枚举中的每个项目循环并提取其值,例如:

enum {
   item 1 = 1,
   item 2 = 7,
   item 3 = 'B'
} items;

说,一个数组。可能的?

5 个答案:

答案 0 :(得分:8)

你的意思是为枚举的每个值构造一个包含一个元素的数组吗?这样你最终得到一个数组{1, 7, 'B'}

不可能。枚举只不过是一堆编译时常量。在运行时,它们实际上只是整数。编译器甚至不检查以确保您在枚举变量中放置有效值(您可以将值5放在那里并且不介意)。因此,它不知道运行时可能的枚举值是什么。

当然,如果你的枚举是连续的(例如,你已经为值0,1,2和3定义了一个枚举),那么你可以使用for循环来做到这一点。

答案 1 :(得分:3)

这是不可能的。 enum项只是常量,类比可以是#define d常量:

#define item_1 1
#define item_2 7
#define item_3 'B'

(警告,#defineenum不相等。这只是一个类比。)

答案 2 :(得分:2)

这不可能以您期望的方式进行。假设您将序列号分配给枚举的成员,那么您可以使用循环迭代值。不幸的是,这是你能做的最好的事情。有关更深入的解释,请参阅this answer

答案 3 :(得分:2)

您可以为枚举项提供明确的连续值,例如:

enum {
   item1=0,
   item2=1,
   numberOfItems=2
} myEnum;

然后循环为

for (k=item1; k<=numberOfItems; k++)

但当然由您来确保myEnum是连续的(即包含您尝试以这种方式循环的值)。

答案 4 :(得分:2)

如果您需要在实际应用程序中执行此操作,这是一种非常常见的情况,您可以通过以下方式执行此操作:

#define ITEM_N  3

typedef enum
{
  item1 = 1,
  item2 = 7,
  item3 = 'B',
} Item_t;

const Item_t LOOKUP_TABLE [ITEM_N] =
{
  item1,
  item2,
  item3
};

...

for(i=0; i<ITEM_N; i++)
{
  printf("%d\n", LOOKUP_TABLE[i]);
}