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
См. также
| вызывает аварийное завершение программы (без очистки) (функция) |
|
Документация по C++ для assert |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/error/assert