_ASSERT
, , _ASSERTE
_ASSERT_EXPR
макросы
Вычисляют выражение и создают отчет об отладке, когда результат равен 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
оцените их booleanExpression
аргумент и_ASSERTE
, когда результат равен 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
. По умолчанию ошибки и сбои проверочных утверждений направляются в окно сообщений отладчика. _CrtSetReportFile
Функции _CrtSetReportMode
используются для определения назначений для каждого типа отчета.
Когда назначение является окном сообщения отладки, а пользователь выбирает кнопку "Повторить", _CrtDbgReportW
возвращает значение 1, что приводит _ASSERT_EXPR
_ASSERT
_ASSERTE
к тому, что макросы запускают отладчик, если включена JIT-отладка.
Дополнительные сведения о процессе создания отчетов см. в _CrtDbgReport
функции . _CrtDbgReportW
Дополнительные сведения об устранении сбоев утверждений и использовании этих макросов в качестве механизма обработки ошибок отладки см. в разделе "Макросы" для создания отчетов.
_ASSERT
Помимо макросов, assert
макрос можно использовать для проверки логики программы. Этот макрос доступен и в отладочной, и в окончательной версиях библиотек. _RPTF
Макросы _RPT
отладки также доступны для создания отчета отладки, но они не оценивают выражение. Макросы _RPT
создают простой отчет. Макросы _RPTF
включают в создаваемый отчет файл исходного кода и номер строки, на которой был вызван макрос отчета. Доступны версии этих макросов для расширенных символов (_RPTW
, _RPTFW
). Версии для расширенных символов идентичны версиям для узких символов, за исключением того, что для всех строковых параметров и вывода используются строки расширенных символов.
Хотя _ASSERT_EXPR
и _ASSERTE
являются макросами и доступны<crtdbg.h>
, включая, приложение должно связаться с отладочной версией библиотеки времени выполнения C, если _DEBUG
она определена, так как эти макросы вызывают другие _ASSERT
функции времени выполнения.
Требования
Макрос | Обязательный заголовок |
---|---|
_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