| Error codes | ||||
| Error codes | ||||
| Assertions | ||||
assert | ||||
(C11)(removed in C23) | ||||
| Bounds checking | ||||
(C11) | ||||
(C11) |
Defined in header <assert.h> | ||
#ifdef NDEBUG #define assert(condition) ((void)0) | (until C23) | |
#ifdef NDEBUG #define assert(...) ((void)0) | (since C23) | |
The definition of the macroassert depends on another macro,NDEBUG, which is not defined by the standard library.
IfNDEBUG is defined as a macro name at the point in the source code where<assert.h> is included, thenassert does nothing.
IfNDEBUG is not defined, thenassert checks ifits argument(until C23)the expression synthesized from__VA_ARGS__(since C23) (which must have scalar type, otherwise, the behavior is undefined) compares equal to zero. If it does,assert outputs implementation-specific diagnostic information on the standard error output and callsabort(). The diagnostic information is required to include the text ofexpression, as well as the values of thepredefined variable__func__ and of(since C99) thepredefined macros__FILE__ and__LINE__.
Contents |
| condition | - | expression of scalar type |
(none)
There is no standardized interface to add an additional message toassert errors. A portable way to include one is to use acomma operator, or use&& with a string literal:
assert(("There are five lights",2+2==5));assert(2+2==5&&"There are five lights");
The implementation ofassert inMicrosoft CRT does not conform to C99 and later revisions, because its underlying function (_wassert) takes neither__func__ nor an equivalent replacement.
Even though the change ofassert in C23 (N2829) is not a formal defect report, the C committeerecommends implementations to backport the change to old modes.
Possible output:
--- Output with NDEBUG not defined: ---a.out: main.cpp:10: main: Assertion `x >= 0.0' failed. --- Output with NDEBUG defined: ---sqrt(x) = -nan
| causes abnormal program termination (without cleaning up) (function)[edit] | |
C++ documentation forassert | |