_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