Макросы для создания отчетов

Обновлен: Ноябрь 2007

Этот раздел применим к:

Выпуск

Visual Basic

C#

C++

Web Developer

Экспресс-выпуск

Тема не применяется Тема не применяется

Только машинные коды

Тема не применяется

Standard

Тема не применяется Тема не применяется

Только машинные коды

Тема не применяется

Pro и Team

Тема не применяется Тема не применяется

Только машинные коды

Тема не применяется

Обозначения:

Тема применяется

Применяется

Тема не применяется

Неприменимо

Тема применяется, но команда по умолчанию сокрыта

Команда или команды скрытые по умолчанию.

Макросы _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 );

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

См. также

Другие ресурсы

Методы отладки CRT