Стандартная библиотека C -<assert.h>
Введение
стандартной библиотеки Cassert.hЗаголовочный файл предоставляет один макрос под названиемassert. Этот макрос можно использовать для проверки предположений, сделанных программой, и вывода диагностических сообщений, когда предположение ложно.
Стандартная библиотека assert.h в основном используется для утверждений во время выполнения программы. Утверждение — это метод проверки предположений, обычно используемый на этапе отладки, чтобы немедленно обнаруживать проблемы, когда программа переходит в неожиданное состояние.
<assert.h>Предоставляемый механизм утверждений — полезный инструмент в языке C, помогающий разработчикам обнаруживать и исправлять ошибки в программах на раннем этапе.
Определённые макросыassertуказывает на другой макросNDEBUG, макросNDEBUGОн не является частью <assert.h>. Если NDEBUG определён как имя макроса в исходном файле, который ссылается на <assert.h>, тоassertМакрос определяется следующим образом:
assert(expression)
Макрос assert используется для проверки истинности выражения expression. Если expression ложно (то есть результат равен 0), assert выводит сообщение об ошибке и завершает выполнение программы. Сообщение об ошибке включает следующее:
- Выражение, вызывающее сбой утверждения
- имя исходного файла
- номер строки
В релизных сборках все assert-утверждения можно отключить, определив NDEBUG. Например:
#define NDEBUG #include <assert.h>
Как только NDEBUG определён, макрос assert будет преобразован препроцессором в пустой оператор, без накладных расходов во время выполнения.
Ниже приведён простой пример, демонстрирующий базовое использование assert:
Пример
#include <assert.h>
void test_positive(int x) {
assert(x > 0);
}
int main() {
int a = 5;
int b = -3;
test_positive(a); // Это утверждение проходит
test_positive(b); // Это утверждение не выполняется, программа завершается
printf("Эта строка не будет выполнена, если утверждение не выполняется.\n");
return 0;
}
В приведенном выше примере при вызове test_positive(b), поскольку b — отрицательное число, утверждение x > 0 не выполнится, и программа выведет информацию, подобную следующей, и завершится:
Assertion failed: (x > 0), file example.c, line 6
Назначение утверждений
- Отладка: На этапе разработки утверждения позволяют быстро обнаружить логические ошибки в программе или ситуации, когда предположения не выполняются.
- Документация: Утверждения могут служить частью документации, описывая предусловия и постусловия функций.
- Защитное программирование: Хотя не рекомендуется использовать утверждения для проверки параметров в боевом коде, в некоторых случаях утверждения могут служить последней линией защиты.
Примечания
- Производительность: В коде, чувствительном к производительности, утверждения могут создавать дополнительные накладные расходы, особенно при частых вызовах. Поэтому в release-сборках утверждения обычно отключаются.
- Обработка ошибок: Утверждения не следует использовать для обработки ожидаемых и исправимых ошибочных ситуаций. Утверждения чаще используются для выявления ошибок программиста.
Библиотечные макросы
Ниже перечислена единственная функция, определённая в заголовочном файле assert.h:
| Порядковый номер | Функции и описания |
|---|---|
| 1 | void assert(int expression) На самом деле это макрос, а не функция, который можно использовать для добавления диагностики в C-программах. |