assert.h

From HandWiki
Short description: Header file for C programs

assert.h is a header file in the C standard library. It defines the C preprocessor macro

assert

and implements runtime assertion in C. assert.h is defined in ANSI C as part of the C standard library. In the C++ programming language, assert.h and

<cassert>

are available; both are functionally equivalent.[1]

Use

The

assert

macro implements runtime assertion. If the expression within it is false, the macro will print a message to stderr and call abort(), defined in stdlib.h. The message includes the source filename and the source line number from the macros __FILE__ and __LINE__, respectively.[2] Since C99, the name of the function the assert statement is included as (__FUNC__) and the expression itself.[3] In ANSI C, the expression in the

assert

macro is defined as signed integer, although any expression that can be implicitly cast to a signed integer may be used. In C99, the

assert

macro explicitly allows any scalar type.[4] Two common uses of the

assert

macro are to assert that a pointer is not null and to ensure that an array index is in-bounds.[5] Below is a program using the

assert

macro. This program will always evaluate

pointer

as false, as

pointer

is a null pointer and does not point to a valid memory location:

#include <assert.h>
int main()
{
    void* pointer = 0;
    assert(pointer);
    return 0;
}

Upon compiling the program and running it, a message similar to the following will be output:

program: source.c:5: main: Assertion 'pointer' failed.
Aborted (core dumped)

The definition of the

assert

macro changes depending on the definition of another macro,

NDEBUG

. If

NDEBUG

is defined as a macro name, the

assert

macro is defined as

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

,[3] thus resulting in the macro not evaluating the expression. The use of

NDEBUG

may affect the overall behavior of a program if one or more

assert

statements contain side effects, as these statements are not evaluated.[6] The

assert

macro does not include an error message. However the comma operator can be used to add it to the printed expression, as in

assert(("Not Orwellian", 2 + 2 == 5));

.[7]

static_assert

In C11, the functionally equivalent declaration _Static_assert was added. assert.h defines static_assert as an alias for _Static_assert to ensure parity with C++.[8] In C23, _Static_assert was renamed to static_assert and the string literal argument was made optional.[9][10] Gnulib defines static_assert for platforms that do not use C11 and does not require assert.h to be included.[11]

References

Citations

Bibliography

  • American National Standards Institute (1990). Rationale for the ANSI C Programming Language. Summit: Silicon Press. ISBN 9780929306070. 
  • Ballman, Aaron; Grammatech (July 6, 2018). Harmonizing static_assert with C++ (Report). 
  • Binder, Robert (2000). Testing Object-oriented Systems: Models, Patterns, and Tools (2nd ed.). Boston: Addison-Wesley. ISBN 9780201809381. 
  • Gregoire, Marc (2021). Professional C++ (5th ed.). Hoboken: Wiley. ISBN 9781119695455. 
  • Gustedt, Jens (February 15, 2022). Revise spelling of keywords (Report). 
  • Kernighan, Brian; Ritchie, Dennis (1988). The C Programming Language (2nd ed.). Hoboken: Prentice Hall. ISBN 9780131103627. 
  • Lischner, Ray (2009). C++ In a Nutshell: A Desktop Quick Reference (2nd ed.). Sebastopol: O'Reilly Media. ISBN 9781449378837. 
  • ISO/IEC JTC 1/SC 22/WG14 (December 1999). ISO/IEC 9899:1999 (Report). 
  • ISO/IEC JTC 1/SC 22/WG21 (January 2012). ISO/IEC 14882:2011 (Report). 
  • Prata, Stephen (2013). C Primer Plus (6th ed.). London: Pearson Education. ISBN 9780133432381. 
  • Swaminathan, Jeganathan (2017). Mastering C++ Programming. Birmingham: Packt. ISBN 9781786461629.