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


assert макрос, _assert, _wassert

Вычисляет выражение и, если результат 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 выводит диагностическое сообщение при expression оценке (0) и вызовы false abort для остановки выполнения программы. Если значение expression равно true (отлично от нуля), никаких действий не выполняется. Диагностическое сообщение включает выражение, где произошел сбой, имя файла исходного кода и номер строки, со сбоем утверждения.

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

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

Чтобы переопределить поведение выходных данных по умолчанию независимо от типа приложения, вызовите _set_error_mode выбор между поведением вывода к stderr и display-dialog-box.

После assert отображения сообщения он вызывает abortдиалоговое окно с кнопками "Прерывание", "Повтор" и "Игнорировать ". abortзавершает программу, поэтому кнопка "Повторить" и "Игнорировать" не возобновляет выполнение программы после assert вызова. Если assert отображается диалоговое окно, abort диалоговое окно не отображается. Единственное время отображения диалогового abort окна — при assert отправке выходных данных в stderr.

В результате приведенного выше поведения диалоговое окно всегда отображается после вызова в режиме assert отладки. Поведение каждой кнопки фиксируется в приведенной ниже таблице.

Режим ошибки stderr Выходные данные в (консоль/_OUT_TO_STDERR) Диалоговое окно отображения (Windows/_OUT_TO_MSGBOX)
Abort Немедленное завершение работы с кодом выхода 3 Немедленное завершение работы с кодом выхода 3
Retry Разрыв в отладчике во время abort Разрыв в отладчике во время assert
Ignore Завершение выхода через abort Продолжить программу, как будто 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.

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

См. также

Обработка ошибок
Управление процессами и средой
abort
raise
signal
_ASSERT, , _ASSERTE_ASSERT_EXPR макросы
_DEBUG