Макрос assert, _assert, _wassert

 

Опубликовано: Октябрь 2016

Самая актуальная документация по Visual Studio 2017: Документация по Visual Studio 2017.

Вычисляет выражение и, если результат false, выводит диагностическое сообщение и прерывает выполнение программы.

assert(   
   expression   
);  
void _assert(  
   char const* message,  
   char const* filename,  
   unsigned line  
);  
void _wassert(  
   wchar_t const* message,  
   wchar_t const* filename,  
   unsigned line  
);  

Параметры

expression
Скалярное выражение (включая выражения указателя), которое возвращает ненулевое значение (true) или 0 (false).

message
Отображаемое сообщение.

filename
Имя файла исходного кода, в котором произошел сбой утверждения.

line
Номер строки в файле исходного кода, в которой произошел сбой утверждения.

Макрос assert обычно используется для выявления ошибок логики во время разработки программы. Используйте его для остановки выполнения программы при возникновении непредвиденных условий. Для этого реализуйте аргумент expression так, чтобы он принимал значение false только в том случае, если программа работает неправильно. Проверки утверждения можно отключить во время компиляции, определив макрос NDEBUG. Вы можете отключить макрос assert , не изменяя файлы исходного кода, с помощью параметра командной строки /DNDEBUG . Можно отключить assert макрос в исходном коде с помощью #define NDEBUG директиву перед <assert.h>включено.</assert.h>

Макрос assert выводит диагностическое сообщение при expression равном false (0) и вызывает функцию abort , чтобы прервать выполнение программы. Если значение expression равно true (отлично от нуля), никаких действий не выполняется. Диагностическое сообщение включает выражение, где произошел сбой, имя файла исходного кода и номер строки, со сбоем утверждения.

Диагностическое сообщение выводится в расширенных символах. Таким образом, работа будет выполняться ожидаемым образом, даже если в выражении содержатся символы юникода.

Назначение диагностического сообщения зависит от типа приложения, которое вызвало подпрограмму. Консольные приложения всегда получают сообщения через stderr. В приложении на основе Windows assert вызывает функцию Windows MessageBox для создания окна сообщения для отображения сообщения вместе с кнопкой ОК . Когда пользователь нажимает ОК, программа немедленно завершается.

Когда приложение связывается с отладочной версией библиотеки среды выполнения, assert создает окно сообщения с тремя кнопками: Прервать, Повторитьи Пропустить. Если пользователь нажимает кнопку Прервать, выполнение программы немедленно прерывается. Если пользователь нажимает кнопку Повторить, вызывается отладчик, и пользователь может выполнить JIT-отладку программы, если JIT-отладка включена. Если пользователь нажимает кнопку Пропустить, assert продолжает нормальное выполнение: создает окно сообщения с кнопкой ОК . Обратите внимание, что нажатие кнопки Пропустить при наличии условия ошибки часто приводит к неожиданному поведению.

Дополнительные сведения об отладке CRT см. в разделе Методы отладки CRT.

Функции _assert и _wassert являются внутренними функциями CRT. Они позволяют свести к минимуму объем кода, требуемый в объектных файлах для поддержки утверждений. Вызывать эти функции напрямую не рекомендуется.

Макрос assert включен и в окончательной, и в отладочной версиях библиотек среды выполнения C, если NDEBUG не определен. Если NDEBUG определен, макрос доступен, но его аргумент не вычисляется и макрос не оказывает никакого действия. Если макрос assert включен, он вызывает _wassert для своей реализации. Другие макросы утверждения, _ASSERT, _ASSERTE и _ASSERT_EXPR, также доступны, но они вычисляют передаваемые им выражения только в том случае, если макрос _DEBUG определен и они находятся в коде, связанном с отладочной версией библиотек среды выполнения C.

ПодпрограммаОбязательный заголовок
assert, _wassert<assert.h>

Сигнатура функции _assert не доступна в файле заголовка. Сигнатура функции _wassert доступна только в том случае, если макрос NDEBUG не определен.

В этой программе функция analyze_string использует макрос assert для проверки нескольких условий, связанных со строкой и длиной. Если какое-либо из условий не выполняется, программа выводит сообщение, указывающее на причину сбоя.

// crt_assert.c  
// compile by using: cl /W4 crt_assert.c  
#include <stdio.h>  
#include <assert.h>  
#include <string.h>  
  
void analyze_string( char *string );   // Prototype  
  
int main( void )  
{  
   char  test1[] = "abc", *test2 = NULL, test3[] = "";  
  
   printf ( "Analyzing string '%s'\n", test1 ); fflush( stdout );  
   analyze_string( test1 );  
   printf ( "Analyzing string '%s'\n", test2 ); fflush( stdout );  
   analyze_string( test2 );  
   printf ( "Analyzing string '%s'\n", test3 ); fflush( stdout );  
   analyze_string( test3 );  
}  
  
// Tests a string to see if it is NULL,   
// empty, or longer than 0 characters.  
void analyze_string( char * string )  
{  
   assert( string != NULL );        // Cannot be NULL  
   assert( *string != '\0' );       // Cannot be empty  
   assert( strlen( string ) > 2 );  // Length must exceed 2  
}  

Программа создает следующие выходные данные:

Analyzing string 'abc'  
Analyzing string '(null)'  
Assertion failed: string != NULL, file crt_assert.c, line 25  

После сбоя утверждения вы можете увидеть сообщение наподобие приведенного ниже (точный текст зависит от версии операционной системы и библиотеки среды выполнения).

A problem caused the program to stop working correctly. Windows will close the program and notify you if a solution is available.  

Если отладчик установлен, нажмите кнопку Отладка , чтобы запустить его, или кнопку Закрыть программу , чтобы выйти.

System::Diagnostics::Debug:: Assert

Обработка ошибок
Управление процессами и средой
прерывание
вызов
сигнал
_ASSERT, _ASSERTE, макросы _ASSERT_EXPR
_DEBUG

Показ: