Files
2025-10-25 03:02:53 +03:00

73 lines
2.4 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[assertions.assert]
# 19 Diagnostics library [[diagnostics]](./#diagnostics)
## 19.3 Assertions [[assertions]](assertions#assert)
### 19.3.3 The assert macro [assertions.assert]
[1](#1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/diagnostics.tex#L465)
If NDEBUG is defined as a macro name
at the point in the source file where <cassert> is included,
the assert macro is defined as#define assert(...) ((void)0)
[2](#2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/diagnostics.tex#L473)
Otherwise, the assert macro puts a diagnostic test into programs;
it expands to an expression of type void which
has the following effects:
- [(2.1)](#2.1)
__VA_ARGS__ is evaluated and contextually converted to bool[.](#2.1.sentence-1)
- [(2.2)](#2.2)
If the evaluation yields true there are no further effects[.](#2.2.sentence-1)
- [(2.3)](#2.3)
Otherwise, the assert macro's expression
creates a diagnostic on the standard error stream (ISO/IEC 9899:2024, 7.23.3) in animplementation-defined
format and calls abort()[.](#2.3.sentence-1)
The diagnostic contains #__VA_ARGS__ and
information on
the name of the source file,
the source line number, and
the name of the enclosing function
(such as provided by source_location::current())[.](#2.3.sentence-2)
[3](#3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/diagnostics.tex#L496)
If __VA_ARGS__ does not expand to
an [*assignment-expression*](expr.assign#nt:assignment-expression "7.6.19Assignment and compound assignment operators[expr.assign]"),
the program is ill-formed[.](#3.sentence-1)
[4](#4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/diagnostics.tex#L501)
The macro assert is redefined according to
the current state of NDEBUG each time that<cassert> is included[.](#4.sentence-1)
[5](#5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/diagnostics.tex#L506)
An expression assert(E) is a [constant subexpression](defns.const.subexpr "3.15constant subexpression[defns.const.subexpr]"), if
- [(5.1)](#5.1)
NDEBUG is defined at the point where assert is last defined or redefined, or
- [(5.2)](#5.2)
E [contextually converted to bool](conv#def:conversion,contextual_to_bool "7.3Standard conversions[conv]") is a constant subexpression that evaluates to the value true[.](#5.sentence-1)