Skip to content

Diagnostics (assert.h)

Include assert.h for the runtime assert macro and the C11 static_assert spelling for compile-time assertions.

Macros

Name Meaning
static_assert C11 spelling for the core _Static_assert declaration.
assert Verify expression; on failure print a diagnostic and abort().

Compile-time assertions

_Static_assert(integer_constant_expression, message) checks an assumption while the program is compiled. DCC accepts the declaration at file scope, block scope, and among struct or union members. The message must be a string literal. A false expression stops compilation and reports the message.

Including assert.h defines static_assert as the standard C11 macro spelling for _Static_assert. Compile-time assertions are not affected by NDEBUG and do not add code or data to the generated program.

#include <assert.h>
#include <stddef.h>

static_assert(sizeof(int) == 2, "this program requires 16-bit int");

struct Record {
    char tag;
    int value;
    _Static_assert(sizeof(long) == 4, "long must be 32 bits");
};

void check_layout(void)
{
    static_assert(offsetof(struct Record, value) == 1,
                  "unexpected Record layout");
}

Use a static assertion for properties the compiler can determine, such as target type sizes, array relationships, enumerator values, and aggregate layout. Its first operand must be an integer constant expression.

Runtime model

assert is implemented in the header, not by a separate debug runtime. When NDEBUG is not defined, assert(expression) evaluates expression. If it is false, the header's helper prints a diagnostic to stderr with fprintf, flushes stderr, and terminates the program with exit(1).

When NDEBUG is defined before including assert.h, assert(expression) expands to ((void)0) and does not evaluate expression.

Runtime assertions

Use assertions for programmer assumptions, not normal input validation:

#include <assert.h>

void use_buffer(char *buf, int len)
{
    assert(buf != 0);
    assert(len > 0);
}

The diagnostic includes the failed expression, source file, and line number. Because failed assertions call exit, normal exit-time flushing and cleanup still run.