Spec-Zone.ru › C

assert

Определено в заголовочном файле <assert.h>
#ifdef NDEBUG
#define assert(condition) ((void)0)
#else
#define assert(condition) /*implementation defined*/
#endif
(до C23)
#ifdef NDEBUG
#define assert(...) ((void)0)
#else
#define assert(...) /*implementation defined*/
#endif
(начиная с C23)

Определение макроса assert зависит от другого макроса, NDEBUG, который не определён стандартной библиотекой.

Если NDEBUG определён как имя макроса в точке исходного кода, где подключается <assert.h>, то assert ничего не делает.

Если NDEBUG не определён, то assert проверяет, равно ли нулю его аргумент(до C23)выражение, сформированное из __VA_ARGS__(начиная с C23) (которое должно иметь скалярный тип, иначе поведение не определено). Если это так, assert выводит в стандартный поток ошибок диагностическую информацию, специфичную для реализации, и вызывает abort(). Диагностическая информация должна содержать текст expression, а также значения предопределённой переменной __func__ и(начиная с C99) предопределённых макросов __FILE__ и __LINE__.

Параметры

condition - выражение скалярного типа

Возвращаемое значение

(нет)

Примечания

Стандартизированного интерфейса для добавления дополнительного сообщения к ошибкам assert нет. Переносимый способ включить такое сообщение — использовать оператор «запятая» или оператор && со строковым литералом:

assert(("There are five lights", 2 + 2 == 5));
assert(2 + 2 == 5 && "There are five lights");

Реализация assert в Microsoft CRT не соответствует C99 и последующим редакциям, поскольку её базовая функция (_wassert) не принимает ни __func__, ни эквивалентную замену.

Хотя изменение assert в C23 (N2829) не является официальным отчётом об ошибке, комитет C рекомендует реализациям перенести это изменение в режимы для старых версий стандарта.

Пример

#include <stdio.h>
// uncomment to disable assert()
// #define NDEBUG
#include <assert.h>
#include <math.h>

#define TEST(...) __VA_ARGS__

int main(void)
{
    double x = -1.0;
    assert(x >= 0.0);
    printf("sqrt(x) = %f\n", sqrt(x));

    assert(TEST(x >= 0.0));

    return 0;
}

Возможный вывод:

--- Output with NDEBUG not defined: ---
a.out: main.cpp:10: main: Assertion `x >= 0.0' failed.

--- Output with NDEBUG defined: ---
sqrt(x) = -nan

Ссылки на стандарты

  • Стандарт C23 (ISO/IEC 9899:2024):
    • 7.2.2.1 Макрос assert (стр. 196)
  • Стандарт C17 (ISO/IEC 9899:2018):
    • 7.2.1.1 Макрос assert (стр. 135)
  • Стандарт C11 (ISO/IEC 9899:2011):
    • 7.2.1.1 Макрос assert (стр. 186–187)
  • Стандарт C99 (ISO/IEC 9899:1999):
    • 7.2.1.1 Макрос assert (стр. 169)
  • Стандарт C89/C90 (ISO/IEC 9899:1990):
    • 4.2.1.1 Макрос assert

См. также

abort
вызывает аварийное завершение программы (без очистки)
(функция)
Документация по C++ для assert

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/error/assert

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API