86______________________________Часть II. Программирование на C++
Директивы #define и #undef
Эти две директивы применяются для создания или удаления символических имен (директива #define использовалась в прошлом также для создания макросов). Директива #define ставит препроцессор в известность, что указанное слово определено или имеет конкретное значение. Когда имя определено, его можно использовать при проверках условий. Например,
ftdefine DEBUG
создает распознаваемое препроцессором имя DEBUG, которое можно подставлять в условные директивы препроцессора. Директива #undef имеет обратный эффект — изымает определенное директивой ^define слово из обращения. Если условие, в которое входит DEBUG имеет значение "истина", то после уничтожения имени DEBUG директивой #undef значение того же условия станет ложным. Применение этого приема продемонстрировано в следующем разделе.
•
Директивы #ifdef, #else и #endif
Директивы #ifdef, #else и #endif используются в комплекте. Если у вас в тексте программы встречается #ifdef, то обязательно должна присутствовать и ftendif; однако использование #else необязательно — необходимость в ней появляется, если условие имеет альтернативную ветвь.
Директивы #ifdef, #define и #endif можно весьма конструктивно приспособить как удачное дополнение к #inciude для управления производимой препроцессором подстановкой текста.
Заголовочные файлы (.П) создают для того, чтобы собрать в них объявления функций, классов и всего прочего, что следует включить более чем в один модуль (.срр). Компилятор, прорабатывая программные модули, размещает все встреченные им имена в таблице символов. Если несколько модулей включают один и тот же заголовочный файл, то это неизбежно вызовет массовые конфликты имен, поскольку в различных исходных файлах окажутся объявленными одинаковые имена из этого заголовка.
Избежать этой неприятной ситуации помогает надежный прием, активно используемый разработчиками Borland. Он состоит в обрамлении кода, находящегося в заголовке, директивами, выполняющими роль сторожей, которые предотвращают возникновение избыточности в таблице символов.
Этот метод продемонстрирован в листинге 4.1 на примере уже знакомой параметризованной функции перестановки (Swap). ,
1: // PARMSWAP.H — Демонстрация дошаблонных параметризованных типов 2: #ifndef _PARMSWAP_H 3: #define PARMSWAP H