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