Глава 4. Препроцессор______________________________________97
1: // TRAP.H — Макрос перехвата кода
2: #ifndef _TRAP_H
3: #define _TRAP_H
4: ^include <fstream.h>
5: inline void Trap( const char* arg, char *file, int line,
6: const char* fname = "DELETEME.TRP")
7: (
8: , ofstream of(fname);
9: of « "code: " « arg «endl
10 < "file: " « file « endl
11 < "line#: " « line « endl;
12 }
13 ftifdef TRAP_CODE
14 #define TRAP(arg) \
15 Trapf #arg, _FILE_, _LINE_); \
16 arg
17 #else
18 ttdefine TRAP(arg) arg
19 ttendif
20 #endif
Строка 1 — это просто напоминание о том, как называется файл.
Строки 2, 3 и 20 — это директивы препроцессора, служащие для предотвращения конфликтов имен.
В строке 4 включается заголовок fstreain.h. Этот файл содержит определения класса файловых потоков. Этот класс, происходящий от иерархии потоков ввода-вывода (см. главу 13), обеспечивает возможность вывода в файл с помощью операции « (исчерпывающее понимание ее работы требует знания классов, потоков и перегрузки операций).
В строках с 5 по 12 определяется встраиваемая функция, которая записывает фрагмент кода, номер строки и имя модуля в текстовый файл. По умолчанию для него используется имя Deleteme.trp, но вы можете по собственному усмотрению изменить его или задать правила, по которым оно будет образовываться.
Строки с 13 по 19 содержат макроопределение. Если символ TRAP_CODE не определен, то оно только исполняет соответствующий код; с другой стороны, когда TRAP_CODE определен, то фрагмент кода не только выполняется, но и протоколируется. Вспомните, что необходимость макроопределения диктуется тем обстоятельством, что значения _LINE_ и _FILE_ должны соответствовать реальным номеру строки и имени вашего файла.
Из текста следующей программы понятно, как включать в программу и использовать перехват: