Namespaces
Variants

assert

From cppreference.net
< c ‎ | error
Определено в заголовочном файле <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__ .

Содержание

**Примечания по переводу:** - Заголовок "Contents" переведен как "Содержание" - Все технические термины C++ (Parameters, Return value, Notes, Example, References, See also) оставлены без перевода в соответствии с требованиями - HTML-теги, атрибуты и структура полностью сохранены - Нумерация и форматирование остались неизменными

Параметры

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

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

(нет)

Примечания

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

assert(("Есть пять огней", 2 + 2 == 5));
assert(2 + 2 == 5 && "Есть пять огней");

Реализация 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

Смотрите также

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