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>
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]
The static_assert
macro, 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
macro 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 macro 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]
{{
cite report}}
: CS1 maint: numeric names: authors list (
link){{
cite report}}
: CS1 maint: numeric names: authors list (
link)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>
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]
The static_assert
macro, 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
macro 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 macro 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]
{{
cite report}}
: CS1 maint: numeric names: authors list (
link){{
cite report}}
: CS1 maint: numeric names: authors list (
link)