_ASSERT、_ASSERTE 宏

将计算表达式并生成调试报告,在结果为 False 时 (仅调试版本)。

_ASSERT( 
   booleanExpression 
);
_ASSERTE( 
   booleanExpression 
);

参数

  • booleanExpression
    计算表达式 (包含指针)为非0或 0。

备注

_ASSERT 和 _ASSERTE 宏提供程序提供整洁简单的机制负责检查假定在调试过程中。 因为它们在 #ifdef 语句位于应用程序的零售版本,而不需要括防止其调用它们非常灵活。 使用 _DEBUG 宏,此灵活性实现。 如果定义了 _DEBUG,则_ASSERT 和 _ASSERTE 才可用。 如果未定义 _DEBUG 时,在预处理期间,这些宏的调用中移除。

_ASSERT 和 _ASSERTE 计算其 booleanExpression 参数,并且,当结果为 false 时 (0),因此输出一个诊断消息并调用 _CrtDbgReportW 生成调试报告。 而 _ASSERTE 在消息,包括不合格的表达式的字符串表示法 _ASSERT 宏打印一个简单的诊断消息。 在 booleanExpression 计算结果为非零,但这些宏不进行任何操作。

_ASSERT 和 _ASSERTE 调用 _CrtDbgReportW,导致所有输出中宽字符 _ASSERTE,因此,正确打印。booleanExpression的 Unicode 字符。

由于 _ASSERTE 宏指定在生成的报告没有用户的表达式,它允许用户确定问题,而无需引用应用程序源代码。 但是,缺点存在 _ASSERTE 计算结果的每个表达式在应用程序的输出 (调试版) 文件包含作为字符串常数。 因此,如果大量调用为 _ASSERTE,这些表达式可大大增加了输出文件的大小。

除非另行指定与 _CrtSetReportMode _CrtSetReportFile 和函数,消息出现在弹出对话框等效于设置:

_CrtSetReportMode(CRT_ASSERT, _CRTDBG_MODE_WNDW);

_CrtDbgReport 或 _CrtDbgReportW 生成调试报告并基于为报表定义的模式和 _CRT_ASSERT 类型或文件当前报表模式确定其一个或多个目标。 默认情况下,断言失败和错误订向到调试消息窗口。 _CrtSetReportMode_CrtSetReportFile 函数用于定义各报表类型的目标。

当目标为调试消息窗口时,并且用户选择重试 按钮, _CrtDbgReport 或 _CrtDbgReportW 返回1, 导致 _ASSERT 和 _ASSERTE 宏,启动调试器,然后调试实时 (JIT) 启用条件下。

进程报告有关的更多信息,请参见 _CrtDbgReport,_CrtDbgReportW 函数。 有关解决断言失败和使用这些宏的更多信息作为调试错误处理机制,请参见 使用验证或报告的宏

_RPT,_RPTF 调试宏对于调试生成报告还可用,但是,它们不计算表达式。 _RPT 一个简单宏生成的报表。 包括 _RPTF 宏报告宏在生成的报告调用的源文件和行号。 除了 _ASSERTE 之外宏,ANSI 断定 例程可用于验证程序逻辑。 该例程包含库的两种调试版本和发布版本。 这些宏宽字符版本可用 (_RPTWn,_RPTFWn)。 宽字符版本与降低字符版本相同,只不过宽字符串的所有字符串参数和输出。

虽然_ASSERT和_ASSERTE是宏并包括 Crtdbg.h 获取,应用程序必须与调试库链接之一,因为这些宏调用其他运行时函数。

  • Libcmtd.lib
    多线程静态库,调试版本。

  • Msvcrtd.lib
    Msvcr90d.dll 的导入库,调试版本。

要求

必需的标头

_ASSERT

<CRTDBG.H>

_ASSERTE

<CRTDBG.H>

示例

在程序中,对 _ASSERT_ASSERTE 宏测试条件 string1 == string2。 如果条件失败,这些宏打印一个诊断消息。 宏的 _RPTn 和组 _RPTFn 此程序还会执行,作为对 printf 函数的重写。

// crt_ASSERT_macro.c
// compile with: /D_DEBUG /MTd /Od /Zi /link /verbose:lib /debug
//
// This program uses the _ASSERT and _ASSERTE debugging macros.
//

#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <crtdbg.h>

int main()
{
   char *p1, *p2;

   // The Reporting Mode and File must be specified
   // before generating a debug report via an assert
   // or report macro.
   // This program sends all report types to STDOUT.
   _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
   _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDOUT);
   _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE);
   _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDOUT);
   _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE);
   _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDOUT);

   // Allocate and assign the pointer variables.
   p1 = (char *)malloc(10);
   strcpy_s(p1, 10, "I am p1");
   p2 = (char *)malloc(10);
   strcpy_s(p2, 10, "I am p2");

   // Use the report macros as a debugging
   // warning mechanism, similar to printf.
   // Use the assert macros to check if the 
   // p1 and p2 variables are equivalent.
   // If the expression fails, _ASSERTE will
   // include a string representation of the
   // failed expression in the report.
   // _ASSERT does not include the
   // expression in the generated report.
   _RPT0(_CRT_WARN,
       "Use the assert macros to evaluate the expression p1 == p2.\n");
   _RPTF2(_CRT_WARN, "\n Will _ASSERT find '%s' == '%s' ?\n", p1, p2);
   _ASSERT(p1 == p2);

   _RPTF2(_CRT_WARN, "\n\n Will _ASSERTE find '%s' == '%s' ?\n",
          p1, p2);
   _ASSERTE(p1 == p2);

   _RPT2(_CRT_ERROR, "'%s' != '%s'\n", p1, p2);

   free(p2);
   free(p1);

   return 0;
}
  

.NET Framework 等效项

System::Diagnostics::Debug::Assert

请参见

参考

调试例程

_RPT、_RPTF、_RPTW、_RPTFW 宏