assert.h
C standard library |
---|
General topics |
Miscellaneous headers |
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
- ↑ Binder 2000, p. 860.
- ↑ Kernighan & Ritchie 1988, p. 253-254.
- ↑ 3.0 3.1 ISO/IEC JTC 1/SC 22/WG14 1999, p. 169.
- ↑ "Linux Programmer's Manual". August 25, 2002. https://fog.misty.com/perry/osp/C99/man/assert.html.
- ↑ Reekie, John (December 7, 1995). "How to use assertions in C". University of California, Berkeley. https://ptolemy.berkeley.edu/~johnr/tutorials/assertions.html.
- ↑ American National Standards Institute 1990, p. 76.
- ↑ Gregoire 2021, p. 1058.
- ↑ Prata 2013, p. 762-763.
- ↑ Gustedt 2022, p. 3.
- ↑ Ballman & Grammatech 2018, p. 1.
- ↑ "GNU Gnulib". Free Software Foundation. February 6, 2023. https://www.gnu.org/software//gnulib/manual/html_node/static_005fassert.html.
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.
Original source: https://en.wikipedia.org/wiki/Assert.h.
Read more |