C Programming/assert.h

From Wikibooks, open books for an open world
Jump to navigation Jump to search

assert.h defines the macro assert. The macro can be used to verify assumptions made by the program and print a diagnostic message if this assumption is false.

When executed, if the expression is false (that is, compares equal to 0), assert writes information about the call that failed on stderr and then calls abort(). The information it writes to stderr includes:

  • the source filename (the predefined macro __FILE__)
  • the source line number (the predefined macro __LINE__)
  • the source function (the predefined identifier __func__) (added in C99)
  • the text of expression that evaluated to 0

Example output of a program compiled with gcc on Linux:

program: program.c:5: main: Assertion `a != 1' failed.
Abort (core dumped)

Programmers can eliminate the assertions without changing the source code: if the macro NDEBUG is defined before the inclusion of <assert.h>, the assert macro is defined simply as:

#define assert(ignore)((void) 0)

and therefore has no effect on the program, not even evaluating its argument. Therefore expressions passed to assert must not contain side-effects since they will not happen when debugging is disabled. For instance:

assert(x = gets());

will not read a line and not assign to x when debugging is disabled.

Macros[edit | edit source]

Functions[edit | edit source]

The C99 standard requires no functions to be declared in the assert.h header.

Notes[edit | edit source]

The definition of the assert macro depends on the state of a macro, NDEBUG, which is not defined in the assert.h header. The macro NDEBUG denotes not using debugging information. If NDEBUG is defined, then assert is defined as an expression which does nothing. Otherwise assert will print debugging information if the expression it tests is false.

External links[edit | edit source]

  • assert.h: verify program assertion – Base Definitions Reference, The Single UNIX® Specification, Issue 7 from The Open Group