Макросы для создания отчетов
Макросы _RPTn и _RPTFn (определенные в CRTDBG.H) можно использовать для отладки вместо операторов printf.Если не определен _DEBUG, эти макросы в окончательной версии построения автоматически исчезают, поэтому их не обязательно заключать в #ifdef.
Макрос |
Функция |
---|---|
_RPT0, _RPT1, _RPT2, _RPT3, _RPT4 |
Выводит строку сообщения и от нуля до четырех аргументов. Строка сообщения служит в качестве printf-строки форматирования стиля для аргументов с _RPT1 по _RPT4. |
_RPTF0, _RPTF1,_RPTF2,_RPTF4, |
Подобны _RPTn, но эти макросы также выводят имя файла и номер строки, где расположен макрос. |
Рассмотрим следующий пример:
#ifdef _DEBUG
if ( someVar > MAX_SOMEVAR )
printf( "OVERFLOW! In NameOfThisFunc( ),
someVar=%d, otherVar=%d.\n",
someVar, otherVar );
#endif
Этот код выводит значения someVar и otherVar в stdout.Вызов _RPTF2 можно применить для отчета об этих значениях плюс имя файла и номер строки:
if (someVar > MAX_SOMEVAR) _RPTF2(_CRT_WARN, "In NameOfThisFunc( ), someVar= %d, otherVar= %d\n", someVar, otherVar );
Если для отладки конкретного приложения нужна отладочная информация, которую макрос CRT не предоставляет, можно написать свой собственный макрос, удовлетворяющий конкретным требованиям.Например, в один из файлов заголовка можно включить код для определения макроса с именем ALERT_IF2:
#ifndef _DEBUG /* For RELEASE builds */
#define ALERT_IF2(expr, msg, arg1, arg2) do {} while (0)
#else /* For DEBUG builds */
#define ALERT_IF2(expr, msg, arg1, arg2) \
do { \
if ((expr) && \
(1 == _CrtDbgReport(_CRT_ERROR, \
__FILE__, __LINE__, msg, arg1, arg2))) \
_CrtDbgBreak( ); \
} while (0)
#endif
Один вызов ALERT_IF2 может выполнить все функции кода printf, описанные в начале этого раздела:
ALERT_IF2(someVar > MAX_SOMEVAR, "OVERFLOW! In NameOfThisFunc( ),
someVar=%d, otherVar=%d.\n", someVar, otherVar );
Поскольку пользовательский макрос легко может быть настроен выдавать больше или меньше информации в зависимости от целей и удобства, этот подход может пригодиться в случае изменения требований при отладке.