Глава 4. Препроцессор____________________________________95
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_ позволит вам использовать эту функцию для трассировки сомнительного кода. Похожие действия выполняет отладчик, но данный вариант более пассивен.