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). ,

h00861.jpg

1: // PARMSWAP.H — Демонстрация дошаблонных параметризованных типов 2: #ifndef _PARMSWAP_H 3: #define PARMSWAP H