Глава 4. Препроцессор____________________________________95

h00951.jpg

1 #include <iostream.h>

2 #ifdef DEBUG_PRINT

3 ttdefine Debug Print(arg) cout « "выполняется: " « #arg « endl; \

4 arg

5 ttelse

6 ttdefine DebugPrint(arg) arg

7 ftendif

Замечание

Этот пример в том виде, как он здесь приведен, хорошо работает только для вывода на консоль. В других случаях следует слегка изменить форму вывода в соответствии с типом пользовательского интерфейса вашей программы.

Поместите этот код в заголовочном файле, и когда вам понадобится отладочная печать, просто включите в свой модуль заголовок и директиву

#define DEBUG_PRINT.

Совет

Объявление DEBUG_PRINT прописными буквами — это просто соглашение, соблюдаемое в книге. Оно также подразумевает объявление имен классов и констант в верхнем регистре. Вам нет необходимости следовать чьим-либо персональным традициям, но в своем коде будьте последовательны.

Итак, заголовок bugprint.h включен, нужное имя определено; наш макрос вполне можно использовать:

DebugPrint( а = 5); // произвольный код

Это выглядит как вызов функции, но препроцессор превратит это в операторы

cout « "выполнение: " « "а=5" « endl;

а=5;

Символ # преобразует код, передаваемый как аргумент, в строку, а вторая строка просто его выполнит. Таким образом, фрагмент кода не только отработает, но и будет выведен на стандартное устройство вывода. Чтобы заменить его выводом в окне сообщения, в файл, на принтер или куда-либо еще надо только вместо cout указать вызов функции записи в соответствующее устройство.

Добавление в оператор вывода значений _LINE_ и _FILE_ позволит вам использовать эту функцию для трассировки сомнительного кода. Похожие действия выполняет отладчик, но данный вариант более пассивен.