| 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++ programming language, <assert.h> and <cassert> are available; both are functionally equivalent. [1]
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>#include<stddef.h>intmain(){void*ptr=NULL;assert(ptr);return0;}Upon compiling the program and running it, a message similar to the following will be output:
program: source.c:5: main: Assertion 'ptr' 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]
The static_assert keyword, added in C++11, serves a similar purpose to the assert macro. Unlike the assert macro, static_assert runs at compile-time rather than at runtime. [8] The original implementation used template hacks.[ citation needed ] The static_assert keyword takes in a constant expression that can be converted into a Boolean and a string literal; if the expression fails, the string literal is returned, otherwise, the assertion has no effect. [8] In C++17, this assertion failure message was made optional, and the subsequent message is omitted if not specified. [9]
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++. [10] In C23, _Static_assert was renamed to static_assert and the string literal argument was made optional. [11] [12] Gnulib defines static_assert for platforms that do not use C11 and does not require <assert.h> to be included. [13]
In Java, assert is a keyword.
In C#, there is no assertion macro or keyword, but instead classes System.Diagnostics.Debug and System.Diagnostics.Trace which provide Assert() methods.
In Rust, there is an assert!() macro.
{{cite report}}: CS1 maint: numeric names: authors list (link){{cite report}}: CS1 maint: numeric names: authors list (link)