assert

From cppreference.com
< c‎ | error
Defined in header <assert.h>
#ifdef NDEBUG

#define assert(condition) ((void)0)
#else
#define assert(condition) /*implementation defined*/

#endif
(until C23)
#ifdef NDEBUG

#define assert(...) ((void)0)
#else
#define assert(...) /*implementation defined*/

#endif
(since C23)

The definition of the macro assert depends on another macro, NDEBUG, which is not defined by the standard library.

If NDEBUG is defined as a macro name at the point in the source code where <assert.h> is included, then assert does nothing.

If NDEBUG is not defined, then assert checks if its 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 calls abort(). The diagnostic information is required to include the text of expression, as well as the values of the predefined variable __func__ and of(since C99) the predefined macros __FILE__ and __LINE__.

Parameters

condition - expression of scalar type

Return value

(none)

Notes

There is no standardized interface to add an additional message to assert errors. A portable way to include one is to use a comma 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 of assert in Microsoft 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 of assert in C23 (N2829) is not a formal defect report, the C committee recommends implementations to backport the change to old modes.

Example

#include <stdio.h>
// uncomment to disable assert()
// #define NDEBUG
#include <assert.h>
#include <math.h>
 
#define TEST(...) __VA_ARGS__
 
int main(void)
{
    double x = -1.0;
    assert(x >= 0.0);
    printf("sqrt(x) = %f\n", sqrt(x));
 
    assert(TEST(x >= 0.0));
 
    return 0;
}

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

References

  • C23 standard (ISO/IEC 9899:2024):
  • 7.2.2.1 The assert macro (p: 196)
  • C17 standard (ISO/IEC 9899:2018):
  • 7.2.1.1 The assert macro (p: 135)
  • C11 standard (ISO/IEC 9899:2011):
  • 7.2.1.1 The assert macro (p: 186-187)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.2.1.1 The assert macro (p: 169)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 4.2.1.1 The assert macro

See also

causes abnormal program termination (without cleaning up)
(function)