The <assert.h> header shall define the assert() macro.
It refers to
the macro NDEBUG which is not defined in the header. If NDEBUG is
defined as a macro name before the inclusion of this header, the
assert() macro shall be defined simply as:
#define assert(ignore)((void) 0)
Otherwise, the macro behaves as described in assert().
The assert() macro shall be redefined according to the current
state of NDEBUG
each time <assert.h> is included.
The assert() macro shall be implemented as a macro, not as a
function. If the
macro definition is suppressed in order to access an actual function,
the behavior is undefined.
The following sections are informative.