96 ____________Часть II. Программирование на C++

Debugprint отключается элементарной отменой определения DEBUG_PRINT директивой #undef. Когда после этого вы перекомпилируете программу, макрос просто заменится на сам код, без операторов вывода. Таким образом, вы ограничили использование директивы #ifdef рамками макроопределений вместо того, чтобы захламлять ею свои программы.

Протоколирование работы программы

Похожую методику можно применить для записи протокола хода выполнения программы в файл. Что делать с этой информацией, решать вам самим;

ее можно использовать многими конструктивными способами.

Отдельные эксперты заявляют о невозможности с чистой совестью утверждать, что в программе проверены все входы'и выходы. Имея в своем распоряжении имя файла и номер строки, вы сможете гарантировать, что прослежена каждая строка кода и адекватно пройдены все альтернативные пути (похоже в недалеком будущем это грозит стать исходным пунктом судебных разбирательств). Когда код будет надлежащим образом оттестирован, трассировку можно отключить.

В этой версии Borland C++ воскрешено средство под названием Profiler, чьей обязанностью является поиск узких мест. Вариант Debugprint может быть полезен для выяснения, где в вашем коде надо начинать их искать. Изучая файл протокола, вы можете определить, какие строки появляются там чаще всего. Цель этого не в том, чтобы подменить существующий инструмент, а в том, чтобы облегчить его использование.

Совет

Начиная оптимизировать свою программу, отыщите в ней те 20 процентов кода, которые выполняют 80 процентов работы, и оптимизируйте в первую очередь их.

Перехват кода

Для того чтобы реализовать перехват кода (code trap), создайте макроопределение (не забывайте, что вам нужны номер строки и имя файла), вызывающее функцию, которая, получив в качестве аргументов строку исполняемого в данный момент кода, имя файла и номер строки, запишет затем полученную информацию в произвольный файл.

Листинг 4.4 демонстрирует пример перехвата кода, в котором информация записывается в файл Deleteme.trp. Это происходит в фоновом режиме, а выходной файл можно будет просмотреть после завершения работы программы (на многопотоковых программах эта техника не проверялась).