Подтвердить что ты не робот

Зачем использовать перечисление, когда #define так же эффективно?

Итак, перечисление работает следующим образом:

enum {
  false,
  true
}

что эквивалентно

int false = 0
int true = 1

Почему бы мне не заменить enum на #define?

#define FALSE 0
#define TRUE 1

Мне кажется, что они взаимозаменяемы. Я знаю, что #define способен обрабатывать аргументы, поэтому работает совсем по-другому, чем enum. Каковы основные виды использования enum, когда мы имеем #define в этом случае?

Если бы я предполагал, что #define является препроцессором, enum будет иметь некоторые преимущества во время выполнения. Как далеко я?

Спасибо заранее.

4b9b3361

Ответ 1

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

pears 0
apples 1
oranges 2
grapes 3
peaches 4
apricots 5

теперь вы хотите поставить мандарины после апельсинов. С#defines, вам придется переопределять количество винограда, персиков и абрикосов. используя enum, это произойдет автоматически. да, это надуманный пример, но, надеюсь, он дает вам эту идею.

Ответ 2

Я нахожу это полезным для отладки в среде, такой как gdb, поскольку значения enum обрабатываются во время компиляции (где #define - макрос препроцессора) и, следовательно, доступны для самоанализа.

Ответ 3

Хотя ваш вопрос отмечен как C, существует большое преимущество при написании на С++, вы можете разместить enum: s внутри классов или пространства имен. Таким образом, вы можете ссылаться на ваши константы, такие как "SpaceshipClass:: galaxy".

Ответ 4

enum - целочисленная константа. поэтому во время процесса компиляции будет проверяться тип.