Compartilhar via


Macros para emissão de relatórios

Você pode usar o _RPTn, e _RPTFn macros, definidas no CRTDBG.H, para substituir o uso de printf instruções para depuração.Essas macros desaparecem automaticamente sua versão build quando Debug não está definido, portanto, não é necessário colocá-los em # ifdefs.

Macro

Função

_RPT0, _RPT1, _RPT2, _RPT3, _RPT4

Gera uma seqüência de mensagem e zero para quatro argumentos.

Para _RPT1 por _RPT4, a string de mensagem serve como um printf-estilo de formatação de seqüência de caracteres para os argumentos.

_RPTF0, _RPTF1,_RPTF2,_RPTF4,

Mesmo que _RPTn , mas essas macros também saída o número de linha e o nome do arquivo onde a macro está localizada.

Considere o exemplo a seguir:

#ifdef _DEBUG
    if ( someVar > MAX_SOMEVAR )
        printf( "OVERFLOW! In NameOfThisFunc( ),
               someVar=%d, otherVar=%d.\n",
               someVar, otherVar );
#endif

Esse código produz os valores de someVar e otherVar para stdout.Você pode usar a seguinte chamada para _RPTF2 para relatar esses mesmos valores e, além disso, o número de linha e o nome do arquivo:

if (someVar > MAX_SOMEVAR) _RPTF2(_CRT_WARN, "In NameOfThisFunc( ), someVar= %d, otherVar= %d\n", someVar, otherVar );

Se você achar que um determinado aplicativo precisa depurar relatórios que não fornecem as macros fornecidas com a biblioteca de tempo de execução C, você pode gravar uma macro projetada especificamente para suas próprias necessidades.Em um dos seus arquivos de cabeçalho, por exemplo, você poderia incluir código como o seguinte para definir uma macro denominada 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

Uma chamada para ALERT_IF2 poderia executar todas as funções do printf código no início deste tópico:

ALERT_IF2(someVar > MAX_SOMEVAR, "OVERFLOW! In NameOfThisFunc( ), 
someVar=%d, otherVar=%d.\n", someVar, otherVar );

Porque uma macro personalizada pode ser alterada facilmente para relatar mais ou menos informações para diferentes destinos (dependendo de qual é mais conveniente), essa abordagem pode ser particularmente útil conforme a evolução das exigências de depuração.

Consulte também

Outros recursos

Técnicas de depuração CRT