Зачем использовать перечисление, когда #define так же эффективно?
Итак, перечисление работает следующим образом:
enum {
false,
true
}
что эквивалентно
int false = 0
int true = 1
Почему бы мне не заменить enum
на #define
?
#define FALSE 0
#define TRUE 1
Мне кажется, что они взаимозаменяемы. Я знаю, что #define
способен обрабатывать аргументы, поэтому работает совсем по-другому, чем enum
. Каковы основные виды использования enum
, когда мы имеем #define
в этом случае?
Если бы я предполагал, что #define
является препроцессором, enum
будет иметь некоторые преимущества во время выполнения. Как далеко я?
Спасибо заранее.
Ответы
Ответ 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 - целочисленная константа. поэтому во время процесса компиляции будет проверяться тип.