Я понимаю первый, а второй? Когда и зачем вы это делаете?
enum cartoon { HOMER, MARGE, BART, LISA, MAGGIE };
enum { HOMER, MARGE, BART, LISA, MAGGIE };
Я понимаю первый, а второй? Когда и зачем вы это делаете?
enum cartoon { HOMER, MARGE, BART, LISA, MAGGIE };
enum { HOMER, MARGE, BART, LISA, MAGGIE };
вы можете определить такое перечисление в классе, которое дает ему область видимости и помогает раскрывать возможности класса, например.
class Encryption {
public:
enum { DEFAUTL_KEYLEN=16, SHORT_KEYLEN=8, LONG_KEYLEN=32 };
// ...
};
byte key[Encryption::DEFAUTL_KEYLEN];
Это просто создает константные выражения, которые имеют соответствующие значения, без типа, отличного от простого int
, поэтому вы не можете использовать неназванное перечисление как тип для чего-либо, вам просто нужно принять int
и то сделайте сравнение с константой.
Что-то вроде этого:
void doSomething(int c);
В сравнении с чем-то вроде этого:
void doSomething(cartoon c);
Кстати, ваша реализация будет такой же, поэтому в случае неназванных перечислений единственным реальным недостатком является сильная типизация.
Второй - это неназванный enum
. Я могу быть полезен, когда вам нужны поля, но вы не собираетесь объявлять переменную этого типа перечисления.
Чтобы обеспечить "очень С++" пример его использования, вы часто увидите это в метапрограммировании шаблонов, где перечисление используется как "возвращаемое значение времени компиляции" без намерения когда-либо объявлять переменную этого типа:
template<class T>
struct some_metafunction
{
enum { res = 0; };
};
enum, union, struct и class имеют общую часть в синтаксисе share the same Этот несобранный шаблон используется редко. Но иногда вы можете это найти.
typedef enum { HOMER, MARGE, BART, LISA, MAGGIE } cartoont;
Или, если у вас есть одна переменная, содержащая только несколько состояний.
enum { HOMER, MARGE, BART, LISA, MAGGIE } my_var;
Это позволяет избежать следующего объявления.
enum cartoon { HOMER, MARGE, BART, LISA, MAGGIE };
cartoon my_var;
Я просто предоставляю пример использования реальной жизни анонимного enum, с которым я столкнулся во встроенном проекте. В проекте EEPROM используется для хранения некоторых параметров. Предположим, что этими параметрами являются те времена, в которых формируется кодовое изображение, каждый параметр имеет размер 1 байт в непрерывном адресе.
Эти параметры копируются в массив, хранящийся в ПЗУ, когда процессор включен.
uint8_t ROM_AGE[END_AGE]
Если мы определим здесь аномальное перечисление:
enum { HOMER_AGE, MARGE_AGE, BART_AGE, LISA_AGE, MAGGIE_AGE, END_AGE };
Затем ключевые слова в перечислении могут использоваться для индексации возраста каждого символа, такого как ROM_AGE[HOMER_AGE]
.
Используя это перечисление, читаемость намного лучше, чем при использовании ROM_AGE[0]
.