Несколько причин:
Причина 1: Гибкость:
enum lickahoctor { yes = 0, no = 1, maybe = 2 };
объявляет перечисление. Вы можете использовать значения yes
, no
и maybe
в любом месте и назначать их для любого целочисленного типа. Вы также можете использовать это как тип, написав
enum lickahoctor myVar = yes;
Это хорошо, потому что если функция принимает параметр с типом enum lickahoctor, вы будете знать, что вы можете присвоить ему yes
, no
или maybe
. Кроме того, отладчик будет знать, поэтому он будет отображать символическое имя вместо числового значения. Проблема в том, что компилятор позволит вам присваивать значения, которые вы определили в enum lickahoctor
, myVar
. Например, если вы хотите определить несколько флагов в базовом классе, а затем добавить еще несколько флагов в подкласс, вы не сможете сделать это таким образом.
Если вместо этого вы используете int, у вас нет этой проблемы. Итак, вы хотите использовать какой-то тип int, чтобы вы могли назначать произвольные константы.
Причина 2: двоичная совместимость:
Компилятор выбирает хороший размер, который соответствует всем константам, которые вы определили в перечислении. Там нет никакой гарантии, что вы получите. Таким образом, если вы записываете структуру, содержащую такую переменную, непосредственно в файл, нет гарантии, что она будет иметь тот же размер, когда вы будете читать ее в следующей версии вашего приложения (по крайней мере, в соответствии со стандартом C - - это не так уж и плохо на практике).
Если вместо этого вы используете какой-то тип int, платформа обычно гарантирует определенный размер для этого числа. Особенно, если вы используете один из типов, которые гарантированно имеют определенный размер, например int32_t
/ uint32_t
.
Причина 3: удобочитаемость и самостоятельная документация
Когда вы объявляете myVar выше, сразу становится ясно, какие значения вы можете в него добавить. Если вы просто используете int или uint32_t
, это не так. Итак, что вы делаете, вы используете
enum { yes, no, maybe };
typedef uint32_t lickahoctor;
для определения подходящего имени для целого числа где-то рядом с константами, которое будет напоминать людям, что переменная этого типа может содержать это значение. Но вы все равно получаете преимущество предсказуемого фиксированного размера и возможности определять дополнительные значения в подклассах, если это необходимо.
Причина 4: поддержка битовых полей
Переменные с типом enum поддерживают только одно значение из их параметров. Поэтому, если вы пытаетесь реализовать битовое поле, вы не можете ввести его как битовое поле. Кроме того, вам нужно использовать переменные без знака, чтобы избежать расширения кода от вас.