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

h00971.jpg

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_ должны соответствовать реальным номеру строки и имени вашего файла.

Из текста следующей программы понятно, как включать в программу и использовать перехват: