96 ____________Часть II. Программирование на C++
Debugprint отключается элементарной отменой определения DEBUG_PRINT директивой #undef. Когда после этого вы перекомпилируете программу, макрос просто заменится на сам код, без операторов вывода. Таким образом, вы ограничили использование директивы #ifdef рамками макроопределений вместо того, чтобы захламлять ею свои программы.
Протоколирование работы программы
Похожую методику можно применить для записи протокола хода выполнения программы в файл. Что делать с этой информацией, решать вам самим;
ее можно использовать многими конструктивными способами.
Отдельные эксперты заявляют о невозможности с чистой совестью утверждать, что в программе проверены все входы'и выходы. Имея в своем распоряжении имя файла и номер строки, вы сможете гарантировать, что прослежена каждая строка кода и адекватно пройдены все альтернативные пути (похоже в недалеком будущем это грозит стать исходным пунктом судебных разбирательств). Когда код будет надлежащим образом оттестирован, трассировку можно отключить.
В этой версии Borland C++ воскрешено средство под названием Profiler, чьей обязанностью является поиск узких мест. Вариант Debugprint может быть полезен для выяснения, где в вашем коде надо начинать их искать. Изучая файл протокола, вы можете определить, какие строки появляются там чаще всего. Цель этого не в том, чтобы подменить существующий инструмент, а в том, чтобы облегчить его использование.
Совет
Начиная оптимизировать свою программу, отыщите в ней те 20 процентов кода, которые выполняют 80 процентов работы, и оптимизируйте в первую очередь их.
Перехват кода
Для того чтобы реализовать перехват кода (code trap), создайте макроопределение (не забывайте, что вам нужны номер строки и имя файла), вызывающее функцию, которая, получив в качестве аргументов строку исполняемого в данный момент кода, имя файла и номер строки, запишет затем полученную информацию в произвольный файл.
Листинг 4.4 демонстрирует пример перехвата кода, в котором информация записывается в файл Deleteme.trp. Это происходит в фоновом режиме, а выходной файл можно будет просмотреть после завершения работы программы (на многопотоковых программах эта техника не проверялась).