Поделиться через


Макрос _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

См. также

Ссылки

Процедуры отладки

Макросы _RPT, _RPTF, _RPTW, _RPTFW