.\" @N
.\" @STR
.\" @GLUE
+.\" @STATIC_ASSERT
.\" @DISCARD
.\" @IGNORE
.\" @DEPRECATED
.BI "size_t N(" array ");"
.BI "STR(" tokens\fR... ")"
.BI "GLUE(" tokens\fR... ", " tokens\fR... ")"
+.BI "STATIC_ASSERT(" cond ", " msg ");"
.BI "void DISCARD(" scalar ");"
.BI "void IGNORE(" variable ");"
preprocessing token.
.PP
The
+.B STATIC_ASSERT
+causes compilation to fail if the integer constant expression
+.I cond
+evaluates to zero. This macro uses the C11
+.B static_assert
+declaration if available, and the
+.I msg
+will be reported in the compiler's diagnostic messsage; otherwise, the macro
+falls back to a somewhat ugly hack which currently ignores the
+.IR msg .
+.PP
+The
.B DISCARD
macro discards its argument, which must be of some scalar type. This
can be useful in muffling warnings about ignoring return codes in cases
/*----- Header files ------------------------------------------------------*/
+#include <assert.h>
+
#ifndef MLIB_COMPILER_H
# include "compiler.h"
#endif
#define MLIB__GLUE(x, y) x##y
#define GLUE(x, y) MLIB__GLUE(x, y)
+#ifdef static_assert
+# define STATIC_ASSERT(cond, msg) static_assert(cond, msg)
+#else
+# define STATIC_ASSERT(cond, msg) \
+ IGNORABLE extern char static_assert_failed[2*!!(cond) - 1]
+#endif
+
/*----- Compiler diagnostics ----------------------------------------------*/
/* --- Compiler-specific definitions --- */