Макрос _ASSERT, _ASSERTE
Вычисляют выражение и создают отчет об отладке, когда результат равен False (только в отладочной версии).
_ASSERT(
booleanExpression
);
_ASSERTE(
booleanExpression
);
Параметры
- booleanExpression
Выражение (включая указатели), результат вычисления которого является или не является нулем.
Заметки
Макросы _ASSERT и _ASSERTE предоставляют приложению чистый и простой механизм для проверки условий во время процесса отладки. Они очень гибки, поскольку они не должны быть заключены в операторы #ifdef, чтобы предотвратить их вызов в коммерческом построении приложения. Эта гибкость достигается с помощью макроса _DEBUG. _ASSERT и _ASSERTE доступны, только когда указан _DEBUG. Если _DEBUG не указан, вызовы этих макросов удаляются во время предварительной обработки.
_ASSERT и _ASSERTE вычисляют свой аргумент booleanExpression, и если результат равен false (0), они выводят диагностическое сообщение и вызывают метод _CrtDbgReportW для создания отчета по отладке. Макрос _ASSERT выводит простое диагностическое сообщение, пока _ASSERTE включает в сообщение строковое представление выражения, которое привело к сбою. Эти макросы не выполняют никаких действий, если booleanExpression не равно нулю.
_ASSERT и _ASSERTE вызывают _CrtDbgReportW, в результате которого весь вывод будет из расширенных символов, и _ASSERTE соответствующим образом печатает символы юникода в booleanExpression.
Поскольку макрос _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 процедура assert может использоваться для проверки программной логики. Эта процедура доступна и в отладочной, и в окончательной версии библиотек. Доступны версии этих макросов для расширенных символов (_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