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

Использование перечисления без имени переменной

Я понимаю первый, а второй? Когда и зачем вы это делаете?

enum cartoon { HOMER, MARGE, BART, LISA, MAGGIE };

enum { HOMER, MARGE, BART, LISA, MAGGIE };
4b9b3361

Ответ 1

вы можете определить такое перечисление в классе, которое дает ему область видимости и помогает раскрывать возможности класса, например.

class Encryption {
public:
  enum { DEFAUTL_KEYLEN=16, SHORT_KEYLEN=8, LONG_KEYLEN=32 };
  // ...
};

byte key[Encryption::DEFAUTL_KEYLEN];

Ответ 2

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

Что-то вроде этого:

void doSomething(int c);

В сравнении с чем-то вроде этого:

void doSomething(cartoon c);

Кстати, ваша реализация будет такой же, поэтому в случае неназванных перечислений единственным реальным недостатком является сильная типизация.

Ответ 3

Второй - это неназванный enum. Я могу быть полезен, когда вам нужны поля, но вы не собираетесь объявлять переменную этого типа перечисления.

Чтобы обеспечить "очень С++" пример его использования, вы часто увидите это в метапрограммировании шаблонов, где перечисление используется как "возвращаемое значение времени компиляции" без намерения когда-либо объявлять переменную этого типа:

template<class T>
struct some_metafunction
{
    enum { res = 0; };
};

Ответ 4

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;

Ответ 5

Я просто предоставляю пример использования реальной жизни анонимного 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].