assert.h
C standard library (libc) |
---|
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++ language <cassert>
may be used instead of <assert.h>
.[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()
. The message includes the source filename and the source line number (from the macros __FILE__
and __LINE__
)[2] and (since C99) the name of the function the assert statement is in (__FUNC__
) and the expression itself.[3] 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.[4]
An example program, and the output (using GCC on Linux):
#include <assert.h>
int main()
{
void* pointer = 0;
assert(pointer);
return 0;
}
program: source.c:5: main: Assertion 'pointer' failed. Aborted (core dumpted)
The value 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][5] so the test is disabled. The expression is not evaluated, but relying on side-effects of the assert expression is a common programming error.
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));
.[6]
static_assert
The static_assert
macro, added in C++11, serves a similar purpose to the assert
macro, but it runs at compile-time rather than execution of the program.[7] In C++17, this assertion failure message was made optional, and the subsequent message is omitted if not specified.[8] Originally this was done with template hacks (which are impossible in C), but all modern compilers provide direct support for this.
In C11, the _Static_assert
declaration was added to provide the same abilities for C.[9] In C23, _Static_assert
was renamed to static_assert
and the string literal argument was made optional.[10][11] Gnulib defines static_assert
for platforms that do not use C11 and does not require assert.h to be included.[12]
Notes
References
Citations
- ^ Binder 2000, p. 860.
- ^ Kernighan & Ritchie 1988, p. 253-254.
- ^ a b ISO/IEC JTC 1/SC 22/WG14 1999, p. 169.
- ^ Reekie, John (December 7, 1995). "How to use assertions in C". University of California, Berkeley. Retrieved March 14, 2023.
- ^ "Linux Programmer's Manual". August 25, 2002. Retrieved March 14, 2023.
- ^ Gregoire 2021, p. 1058.
- ^ ISO/IEC JTC 1/SC 22/WG21 2012, p. 134.
- ^ Swaminathan 2017, p. 13.
- ^ Prata 2013, p. 762-763.
- ^ Gustedt 2022, p. 3.
- ^ Ballman & Grammatech 2018, p. 1.
- ^ "GNU Gnulib". Free Software Foundation. February 6, 2023. Retrieved March 14, 2023.
Bibliography
- 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).
{{cite report}}
: CS1 maint: numeric names: authors list (link) - ISO/IEC JTC 1/SC 22/WG21 (January 2012). ISO/IEC 14882:2011 (Report).
{{cite report}}
: CS1 maint: numeric names: authors list (link) - Prata, Stephen (2013). C Primer Plus (6th ed.). London: Pearson Education. ISBN 9780133432381.
- Swaminathan, Jeganathan (2017). Mastering C++ Programming. Birmingham: Packt. ISBN 9781786461629.