_ASSERT, _ASSERTE宏
请计算表达式并生成调试报告,在该结果是 False 时 (请只调试版本)。
_ASSERT(
booleanExpression
);
_ASSERTE(
booleanExpression
);
参数
- booleanExpression
计算为非零或 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;
}