Share via


用于报告的宏

可以使用在 CRTDBG.H 中定义的 _RPTn_RPTFn 宏替换 printf 语句进行调试。 未定义 _DEBUG 时,这些宏在发布版本中自动消失,因此不必将它们括在 #ifdef 内。

说明

_RPT0_RPT1_RPT2_RPT3_RPT4

向四个参数输出一个消息字符串和零。 对于从 _RPT1 到 _RPT4,消息字符串作为参数的 printf 样式的格式化字符串。

_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 );

如果发现某特定应用程序需要调试报告,而 C 运行库提供的宏不提供该报告,则可以编写专门设计的宏来符合您自己的要求。 例如,可以在其中一个头文件中包含以下代码来定义名为 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 调试方法