assert
|
Определено в заголовочном файле
<assert.h>
|
||
|
#ifdef NDEBUG
#define assert(condition) ((void)0)
|
(до C23) | |
|
#ifdef NDEBUG
#define assert(...) ((void)0)
|
(начиная с C23) | |
Определение макроса
assert
зависит от другого макроса,
NDEBUG
, который не определён стандартной библиотекой.
Если
NDEBUG
определён как имя макроса в точке исходного кода, где
<assert.h>
подключается, то
assert
не выполняет никаких действий.
Если
NDEBUG
не определён, то
assert
проверяет, сравнивается ли
его аргумент
(до C23)
выражение, синтезированное из
__VA_ARGS__
(начиная с C23)
(которое должно иметь скалярный тип, иначе поведение не определено) с нулём. Если это так,
assert
выводит зависящую от реализации диагностическую информацию в стандартный поток ошибок и вызывает
abort
(
)
. Диагностическая информация должна включать текст
expression
, а также значения
предопределённой переменной
__func__
и
(начиная с C99)
предопределённых макросов
__FILE__
и
__LINE__
.
Содержание |
Параметры
| условие | - | выражение скалярного типа |
Возвращаемое значение
(нет)
Примечания
Не существует стандартизированного интерфейса для добавления дополнительного сообщения к ошибкам
assert
. Переносимым способом включения такого сообщения является использование
оператора запятой
или применение
&&
со строковым литералом:
assert(("Есть пять огней", 2 + 2 == 5)); assert(2 + 2 == 5 && "Есть пять огней");
Реализация
assert
в
Microsoft CRT
не соответствует стандартам C99 и более поздним версиям, поскольку её базовая функция (
_wassert
) не принимает ни
__func__
, ни эквивалентную замену.
Несмотря на то, что изменение
assert
в C23 (
N2829
) не является формальным отчётом о дефектах, комитет по C
рекомендует
реализациям перенести это изменение в старые режимы.
Пример
Возможный вывод:
--- 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
|
|