Глава 9. Описатели и спецификаторы данных________________________275
Если имеется набор упорядоченных постоянных целочисленных величин, то можно сэкономить свой труд, использовав перечисление (или перечислимый список). Перечислимый список общего вида
enum list_name { ITEM__1, ITEM_2, ITEM_3, [ и т. д.] };
в применении к стандартным значениям цветов (Red, Green, Blue) может породить следующее:
enum RGB_COLORS ( BLACK, BLUE, GREEN, CYAN, RED, MAGENTA,
BROWN, GRAY, DARK_GRAY, LT_BLUE,. LT_GREEN,
LT_CYAN, LT_RED /* ИЛИ PINK */, LT_ MAGENTA, YELLOW, WHITE };
Ключевое слово enum обозначает наличие списка. Имя списка выполняет роль имени типа, а элементам списка присваивается значения 0 — первому элементу, 1 — второму и т. д. Такой порядок сохраняется до тех пор, пока какому-либо пункту списка значение не будет присвоено явно.
Второй пример — интерпретация адресов видеопамяти как .перечислимого списка — может осуществляться следующим образом:
enum VIDEO_BASE_ADDRESS { VGA_EGA = OxAOOOOOO, CGA = OxBBOOOOO, ^MONO = OxBOOOOOO };
Замечание
Во всех примерах в этой книге константы записываются символами верхнего регистра с подчеркиваниями между словами. Поскольку перечисления и величины, входящие в список, обладают постоянными значениями, они так же обозначаются по указанному принципу. Как показано во втором примере, эти величины не обязательно перечислять по порядку.
Как уже говорилось, есть и еще одно соображение. Каждое глобальное имя требует для себя поля в таблице символов (таблица символов используется для разрешения ссылок при компоновке). Эта таблица не бесконечна. Помимо классов и связанных с ними конструкций, свое место в ней занимают и глобальные константы.
Часто получается так, что идентификатор константы должен существовать в вашем классе. К сожалению, приходящее на ум решение — разместить константы в классе — не срабатывает. Переменные или объекты, заданные как константы, требуют начального значения в момент определения, но как раз с константами-то вы и не можете так поступить.
Рассмотрим структуру, содержащую целочисленный массив , постоянной размерности:
struct INT_ARRAY ( .
const int MAX = 100; // ОШИБКА: выполнить невозможно
int data[MAX];