Стандартная библиотека 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 <stdio.h>
#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:

Порядковый номерФункции и описания
1void assert(int expression)
На самом деле это макрос, а не функция, который можно использовать для добавления диагностики в C-программах.
Другие расширения