Когда использовать перечисления? - PullRequest
1 голос
/ 27 сентября 2011

Я сейчас читаю о перечислениях в C. Я понимаю, как они работают, но не могу понять, в каких ситуациях они могут быть полезны. Можете ли вы привести несколько простых примеров, когда использование enums подходит?

Ответы [ 5 ]

4 голосов
/ 27 сентября 2011

Они часто используются для группировки связанных значений:

enum errorcode {
    EC_OK = 0,
    EC_NOMEMORY,
    EC_DISKSPACE,
    EC_CONNECTIONBROKE,
    EC_KEYBOARD,
    EC_PBCK
};
3 голосов
/ 27 сентября 2011

Перечисления - это просто способ объявления постоянных значений с большей ремонтопригодностью. Преимущества включают в себя:

  • Компиляторы могут автоматически присваивать значения, когда они непрозрачны.
  • Они смягчают программистов, которые делают плохие вещи, такие как int monday = SUNDAY + 1.
  • Они позволяют легко объявлять все ваши связанные константы в одном месте.

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

2 голосов
/ 27 сентября 2011

Иногда вы хотите выразить что-то конечное и дискретное.Примером из учебника по программированию GNU C являются направления компаса.

enum compass_direction
{
  north,
  east,
  south,
  west
};

Другим примером, когда пригодна возможность перечислений соответствовать целым числам, могут быть коды состояния.Обычно код ОК начинается с 0, поэтому его можно использовать в конструкциях if.

1 голос
/ 27 сентября 2011

Концепция перечисления также иногда называется «перечислимым типом».То есть это тип, все возможные значения которого названы и перечислены как часть определения типа.

C фактически отклоняется от этого бита, поскольку если a и bзначения в перечислении, тогда a|b также является допустимым значением этого типа, независимо от того, указан он в списке и назван или нет.Но вам не нужно использовать этот факт, вы можете использовать перечисление как перечислимый тип.

Они подходят, когда вам нужна переменная, возможные значения которой представляют одно из фиксированного списка вещей.Они также иногда подходят, когда вы хотите определить связку связанных констант времени компиляции, тем более что в C (в отличие от C ++) const int не является константой времени компиляции.

Я думаю, чтоих наиболее полезные свойства:

1) Вы можете кратко определить набор различных констант, где вас не волнует, какие значения, если они различны.typedef enum { red, green, blue } color; лучше, чем:

#define red   0
#define green 1
#define blue  2

2) Программист, увидев параметр / возвращаемое значение / переменную типа color, знает, какие значения допустимы и что они означают (или в любом случае знает, как)чтобы посмотреть это).Лучше, чем сделать его int, но задокументировать «этот параметр должен быть одним из значений цвета, определенных в каком-либо заголовке или другом».

3) Ваш отладчик, увидев переменную типа color, можетбыть в состоянии сделать обратный поиск, и дать red в качестве значения.Лучше, чем искать это в источнике.

4) Компилятор, увидев switch выражения типа color, может предупредить вас, если нет default и какой-либо изперечисленные значения отсутствуют в списке case с.Это помогает избежать ошибок, когда вы делаете что-то другое для каждого значения перечисления.

0 голосов
/ 27 сентября 2011

Перечисления в основном используются, потому что их легче читать программистам, чем целые числа. Например, вы можете создать enum, который представляет dayy за неделю.

enum DAY {Monday, Tuesday....}

Понедельник эквивалентен целому числу 0, вторник = понедельник + 1 и т. Д.

Таким образом, вместо целых чисел, которые представляют каждый день недели, вы можете использовать новый тип DAY для представления этой же концепции. Программисту легче читать, но то же самое для компилятора.

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