assert()

Вывести отладочное сообщение и опционально остановить выполнение программы

Прототип:

#include <assert.h>
void assert( int expression );

Аргументы:

expression
Ноль, если необходимо завершить программу; ненулевое значение в противном случае.

Библиотека:

libc

Описание:

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

Если expression имеет ненулевое значение, никаких действий не предпринимается.

Обычно макрос assert() используется при разработке программы для определения логических ошибок. Следует подобрать expression так, чтобы оно было истинным, когда программа работает корректно.

После того, как программа отлажена, можно использовать специальный идентификатор NDEBUG для удаления вызовов assert() из программы во время следующей компиляции. При использовании опции -D для qcc или директивы #define для определения NDEBUG (с каким-либо значением) препроцессор C игнорирует все вызовы assert() в коде программы.


Caution: Для удаления вызовов assert() нужно определить NDEBUG в коде перед включением заголовочного файла <assert.h> (то есть перед #include <assert.h>).

Если NDEBUG определен, препроцессор игнорирует также и выражение, переданное в assert(). Например, если код включает:

assert( (fd = open( "filename", O_RDWR )) != -1 );

и NDEBUG определен, препроцессор игнорирует полный вызов assert(), включая вызов open().


Примеры:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
void process_string( char *string )
{
/* use assert to check argument */
assert( string != NULL );
assert( *string != '\0' );
/* rest of code follows here */
}
int main( void )
{
process_string( "hello" );
process_string( "" );
return (EXIT_SUCCESS);
}

Классификация:

ANSI, POSIX 1003.1

Безопасность использования
Точка остановки потока
Нет
Обработчик прерываний
Нет
Обработчик сигналов
Нет
В потоке
Да

Предостережения:

assert() является макросом.

Тематические ссылки:

abort(), stderr




Предыдущий раздел: Описание API системной библиотеки