Ответ 1
Несколько причин:
Причина 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: Поддержка битполей
Переменные, перечисленные только переменные, поддерживают только назначение одного значения из своих опций. Поэтому, если вы пытаетесь реализовать бит-бит, вы не можете вводить его как бит-поле. Кроме того, вам нужно использовать неподписанные переменные, чтобы избежать расширения расширений.