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, который не определен стандартной библиотекой.
NDEBUG определен как имя макроса в месте в исходном коде, где включён <cassert> или <assert.h>, утверждение отключено: assert ничего не делает.|
| (до C++26) |
|
| (с C++26) |
| Выражение
| (с C++17) |
Параметры
| condition | - | выражение скалярного типа |
Возвращаемое значение
(нет)
Примечания
| Поскольку 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) | выполняет проверку утверждений на этапе компиляции |
| вызывает аномальное завершение программы (без очистки) (функция) |
|
C документация для assert |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/error/assert