Цикл каждого элемента в перечислении - PullRequest
4 голосов
/ 05 июля 2011

Можно ли выполнить цикл и извлечь его значение для каждого элемента в перечислении, например:

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

Скажем, массив.Возможно ли это?

Ответы [ 5 ]

8 голосов
/ 05 июля 2011

Вы хотите создать массив с одним элементом для каждого значения перечисления? Таким образом, вы получите массив {1, 7, 'B'}?

Не возможно. Перечисление не намного больше, чем набор констант времени компиляции. Во время выполнения они фактически просто целые. Компилятор даже не проверяет, правильно ли вы помещаете допустимые значения в свою переменную enum (вы можете поместить туда значение 5, и это не будет против). Поэтому он не знает, каковы возможные значения перечисления во время выполнения.

Конечно, если ваше перечисление смежно (скажем, вы определили перечисление для значений 0, 1, 2 и 3), то вы можете сделать это с помощью цикла for.

3 голосов
/ 05 июля 2011

это невозможно.enum элементы являются просто константами, аналогия может быть #define d константами:

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

(Внимание, #define и enum не равны. Это просто аналогия).

2 голосов
/ 05 июля 2011

Если вам нужно сделать это в реальном приложении, что является довольно распространенным сценарием, вы должны сделать это следующим образом:

#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]);
}
2 голосов
/ 05 июля 2011

Вы можете дать своим перечисляемым элементам явно смежные значения, такие как:

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

, а затем выполнить цикл как

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

, но, конечно же, вы должны убедиться, что myEnum является смежным (то есть содержит значения, которые вы пытаетесь циклически обработать таким образом).

2 голосов
/ 05 июля 2011

Это невозможно так, как вы ожидаете. Предполагая, что вы присваиваете порядковые номера членам перечисления, вы можете перебирать значения, используя цикл. К сожалению, это лучшее, что вы можете сделать. См. этот ответ для более подробного объяснения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...