Змінна, яка може приймати значення з деякого списку значень, називається змінною перелічуваного типу, або переліком.

Оголошення переліку починається з ключового слова enum і має два формати подання.

Формат 1. enum [ім’я-тега-переліку] {список-перелік} описувач[, описувач...];

Формат 2. enum імя-тега-переліку описувач описувач[, описувач...];

Оголошення переліку задає тип змінної переліку і визначає список іменованих констант, який називається списком переліку. Значенням кожного імені списку є деяке ціле число.

Змінна типу переліку може приймати значення однієї з іменованих констант списку. Іменовані константи списку мають тип int. Таким чином, пам’ять відповідна змінної переліку, це пам’ять необхідна для розміщення значення типу int.

Змінна типу enum можуть використовуватися в індексних виразах і як операнди в арифметичних операціях і в операціях відношення.

У першому форматі 1 імена і значення переліку задаються в списку переліків. Необов’язкове ім'я-тега-переліку, це ідентифікатор, який іменує тег переліку, визначений списком переліку. Описувач іменує змінну переліку. У оголошенні може бути задана більш ніж одна змінна типу переліку.

Список-перелік містить одну або декілька конструкцій вигляду:

ідентифікатор [= константний вираз]

Кожен ідентифікатор іменує елемент переліку. Всі ідентифікатори в списку enum повинні бути унікальними. У разі відсутності константного виразу першому ідентифікатору відповідає значення 0, наступному ідентифікатору – значення 1 і т.д. Ім’я константи переліку еквівалентне її значенню.

Ідентифікатор, пов’язаний з константним виразом, приймає значення, що задається цим константним виразом. Константний вираз повинен мати тип int і може бути як позитивним, так і негативним. Наступному ідентифікатору в списку привласнюється значення, рівне константному виразу плюс 1, якщо цей ідентифікатор не має свого константного виразу. Використання елементів переліку повинне підкорятися наступним правилам:

Змінна може містити значення, що повторюються.

  1. Ідентифікатори в списку переліку повинні бути відмінні від всіх інших ідентифікаторів в тій же області видимості, включаючи імена звичних змінних і ідентифікатори з інших списків переліків.
  2. Імена типів переліків повинні бути відмінні від інших імен типів переліків, структур і сумішей в цій же області видимості.
  3. Значення може слідувати за останнім елементом списку переліку.

Приклад:

1enum week { SATURDAY = 0, /*  0  */
2            SUNDAY = 0,   /*  0  */
3            MONDAY = 1,   /*  1  */
4            TUESDAY,      /*  2  */
5            WEDNESDAY,    /*  3  */
6            THURSDAY,     /*  4  */
7            FRIDAY        /*  5  */ }  workdays;

У даному прикладі оголошений перелічуючий тег week, з відповідною множиною значень, і оголошена змінна workdays що має тип week.

У другому форматі використовується ім’я тега переліку для посилання на тип переліку, визначуваний десь у іншому місці. Ім’я тега переліку повинне відноситься до вже визначеного тегу переліки в межах поточної області видимості. Оскільки тег переліки оголошений десь у іншому місці, список переліку не представлений в оголошенні.

Приклад: enum week rab1;

У оголошенні покажчика на тип даних переліку і оголошуваних typedef для типів переліку можна використовувати ім’я тега переліку до того, як даний тег переліки визначений. Проте визначення переліку повинне передувати будь-якій дії використовуваного покажчика на тип оголошення typedef. Оголошення без подальшого списку описувачів описує тег, або, якщо так можна сказати, шаблон переліку.