Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Вычисляют выражение и создают отчет об отладке, когда результат равен false (только в отладочной версии).
Синтаксис
// Typical usage:
_ASSERT_EXPR( booleanExpression, message );
_ASSERT( booleanExpression );
_ASSERTE( booleanExpression );
Параметры
booleanExpression
Скалярное выражение (включая выражения указателя), которое возвращает ненулевое значение (true) или 0 (false).
message
Расширенная строка, отображаемая в составе отчета.
Замечания
Макросы _ASSERT_EXPR, _ASSERT и _ASSERTE представляют собой простой и четкий механизм, с помощью которого приложение может проверять условия во время процесса отладки. Они гибки, поскольку они не должны быть заключены в #ifdef инструкции, чтобы предотвратить их вызов в розничной сборке приложения. Эта гибкость достигается с помощью _DEBUG макроса. Макросы_ASSERT_EXPR, _ASSERT и _ASSERTE доступны только тогда, когда макрос _DEBUG определен во время компиляции. Если _DEBUG не определено, вызовы этих макросов удаляются во время предварительной обработки.
_ASSERT_EXPRи _ASSERT оцените их _ASSERTE аргумент иbooleanExpression, когда результат равен false (0), они печатают диагностическое сообщение и вызывают _CrtDbgReportW создание отчета отладки. Макрос _ASSERT выводит простое диагностическое сообщение, _ASSERTE включает строковое представление неудачного выражения в сообщении и _ASSERT_EXPR включает message строку в диагностическом сообщении. Эти макросы не выполняют никаких действий, если аргумент booleanExpression не равен нулю.
_ASSERT_EXPR, _ASSERT и _ASSERTE вызывают _CrtDbgReportW, благодаря чему выходные данные содержат только расширенные символы.
_ASSERTE надлежащим образом выводит символы Юникода в booleanExpression , а _ASSERT_EXPR выводит символы Юникода в message.
Так как макрос _ASSERTE указывает вызвавшее сбой выражение, а _ASSERT_EXPR позволяет указать сообщение в создаваемом отчете, они позволяют определить проблему без обращения к исходному коду приложения. Однако недостаток состоит в том, что каждое message , выводимое _ASSERT_EXPR , и каждое выражение, вычисляемое _ASSERTE , включается в файл вывода (в отладочной версии) приложения как строковая константа. Поэтому при большом количестве вызовов _ASSERT_EXPR или _ASSERTEэти выражения могут значительно увеличить размер файла вывода.
Если вы не указываете в противном случае с _CrtSetReportMode_CrtSetReportFile функциями, сообщения отображаются во всплывающем диалоговом окне, эквивалентном параметру:
_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_WNDW);
_CrtDbgReportW создает отчет об отладке и определяет его место или места назначения на основании текущего режима или режимов отчета и файла, определенного для типа отчета _CRT_ASSERT . По умолчанию ошибки и сбои проверочных утверждений направляются в окно сообщений отладчика.
_CrtSetReportMode Функции _CrtSetReportFile используются для определения назначений для каждого типа отчета.
Когда назначение является окном сообщения отладки, а пользователь выбирает кнопку "Повторить", _CrtDbgReportW возвращает значение 1, что приводит _ASSERT_EXPR_ASSERT_ASSERTE к тому, что макросы запускают отладчик, если включена JIT-отладка.
Дополнительные сведения о процессе создания отчетов см. в _CrtDbgReportфункции . _CrtDbgReportW Дополнительные сведения об устранении сбоев утверждений и использовании этих макросов в качестве механизма обработки ошибок отладки см. в разделе "Макросы" для создания отчетов.
_ASSERT Помимо макросов, assert макрос можно использовать для проверки логики программы. Этот макрос доступен и в отладочной, и в окончательной версиях библиотек.
_RPT
_RPTF
отладки также доступны для создания отчета отладки, но они не оценивают выражение. Макросы _RPT создают простой отчет. Макросы _RPTF включают в создаваемый отчет файл исходного кода и номер строки, на которой был вызван макрос отчета. Доступны версии этих макросов для расширенных символов (_RPTW, _RPTFW). Версии для расширенных символов идентичны версиям для узких символов, за исключением того, что для всех строковых параметров и вывода используются строки расширенных символов.
Хотя _ASSERT_EXPRи _ASSERT являются макросами и доступны_ASSERTE, включая, приложение должно связаться с отладочной версией библиотеки времени выполнения C, если <crtdbg.h> она определена, так как эти макросы вызывают другие _DEBUG функции времени выполнения.
Требования
| Макрос | Обязательный заголовок |
|---|---|
_ASSERT_EXPR, , _ASSERT_ASSERTE |
<crtdbg.h> |
Пример
В этой программе макросы _ASSERT и _ASSERTE вызываются для проверки условия string1 == string2. Если условие не выполняется, эти макросы выводят диагностическое сообщение. Группа макросов _RPT и _RPTF также используется в этой программе — в качестве альтернативы функции 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;
}
Use the assert macros to evaluate the expression p1 == p2.
crt_ASSERT_macro.c(54) :
Will _ASSERT find 'I am p1' == 'I am p2' ?
crt_ASSERT_macro.c(55) : Assertion failed!
crt_ASSERT_macro.c(58) :
Will _ASSERTE find 'I am p1' == 'I am p2' ?
crt_ASSERT_macro.c(59) : Assertion failed: p1 == p2
'I am p1' != 'I am p2'
См. также
Отладка подпрограмм
assert Макрос, _assert, _wassert
_RPT, , _RPTF_RPTWмакросы _RPTFW