Spec-Zone.ru › C

assert

Определено в заголовке <assert.h>
#ifdef NDEBUG
#define assert(condition) ((void)0)
#else
#define assert(condition) /*implementation defined*/
#endif

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

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

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

Параметры

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

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

(ничего)

Примечания

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

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

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

Пример

#include <stdio.h>
// uncomment to disable assert()
// #define NDEBUG
#include <assert.h>
#include <math.h>
 
int main(void)
{
    double x = -1.0;
    assert(x >= 0.0);
    printf("sqrt(x) = %f\n", sqrt(x));   
 
    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

Ссылки

  • Стандарт 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/w/c/error/assert

Spec-Zone.ru

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