Spec-Zone.ru › C++

assert

Определено в заголовочном файле <cassert>
Отключенное утверждение
(1)
#define assert(condition) ((void)0)
(до C++26)
#define assert(...)       ((void)0)
(с C++26)
Включенное утверждение
(2)
#define assert(condition) /* unspecified */
(до C++26)
#define assert(...)       /* unspecified */
(с C++26)

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

1) Если NDEBUG определен как имя макроса в месте в исходном коде, где включён <cassert> или <assert.h>, утверждение отключено: assert ничего не делает.
2) В противном случае утверждение включено:

assert проверяет, равна ли его аргумент (который должен иметь скалярный тип) нулю. Если это так, assert выводит специфичную для реализации диагностическую информацию в стандартный поток ошибок и вызывает std::abort. Диагностическая информация должна включать текст condition, а также значения предопределенной переменной __func__ и(с C++11) предопределённых макросов __FILE__ и __LINE__.

(до C++26)

assert помещает диагностический тест в программы и раскрывается в выражение типа void. __VA_ARGS__ вычисляется и контекстуально преобразуется в bool:

  • Если вычисление приводит к true, дальнейших эффектов нет.
  • В противном случае выражение макроса assert создает диагностику в стандартном потоке ошибок в определённом реализацией формате и вызывает std::abort(). Диагностика содержит #__VA_ARGS__ и информацию о имени файла, номере строки и имени окружающей функции (например, предоставляемой std::source_location::current()).
(с C++26)

Выражение assert(E) гарантированно является постоянным подвыражением, если либо

  • NDEBUG определен в момент, когда assert был последний раз определен или переопределен, или
  • E, контекстуально преобразованное в bool, является постоянным подвыражением, которое вычисляется в true.
(с C++17)

Параметры

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

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

(нет)

Примечания

Поскольку assert является макросом с аргументами, запятые в аргументе, которые не защищены скобками, интерпретируются как разделители аргументов макроса. Такие запятые часто встречаются в списках шаблонов аргументов и инициализации списком:

assert(std::is_same_v<int, int>);        // error: assert does not take two arguments
assert((std::is_same_v<int, int>));      // OK: one argument
static_assert(std::is_same_v<int, int>); // OK: not a macro
 
std::complex<double> c;
assert(c == std::complex<double>{0, 0});   // error
assert((c == std::complex<double>{0, 0})); // OK
(до C++26)

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

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

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

Пример

#include <iostream>
// uncomment to disable assert()
// #define NDEBUG
#include <cassert>
 
// Use (void) to silence unused warnings.
#define assertm(exp, msg) assert(((void)msg, exp))
 
int main()
{
    assert(2 + 2 == 4);
    std::cout << "Checkpoint #1\n";
 
    assert((void("void helps to avoid 'unused value' warning"), 2 * 2 == 4));
    std::cout << "Checkpoint #2\n";
 
    assert((010 + 010 == 16) && "Yet another way to add an assert message");
    std::cout << "Checkpoint #3\n";
 
    assertm((2 + 2) % 3 == 1, "Success");
    std::cout << "Checkpoint #4\n";
 
    assertm(2 + 2 == 5, "Failed"); // assertion fails
    std::cout << "Execution continues past the last assert\n"; // No output
}

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

Checkpoint #1
Checkpoint #2
Checkpoint #3
Checkpoint #4
main.cpp:23: int main(): Assertion `((void)"Failed", 2 + 2 == 5)' failed.
Aborted

См. также

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

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

Spec-Zone.ru

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