From f50c1365107c09453531f01bcaebc3b197c3627f Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Thu, 26 Sep 2019 20:18:11 +0100 Subject: [PATCH] utils/macros.h: Introduce a `STATIC_ASSERT' macro. --- utils/macros.3 | 14 ++++++++++++++ utils/macros.h | 9 +++++++++ 2 files changed, 23 insertions(+) diff --git a/utils/macros.3 b/utils/macros.3 index a2a9003..98ab238 100644 --- a/utils/macros.3 +++ b/utils/macros.3 @@ -5,6 +5,7 @@ macros \- useful macros .\" @N .\" @STR .\" @GLUE +.\" @STATIC_ASSERT .\" @DISCARD .\" @IGNORE .\" @DEPRECATED @@ -24,6 +25,7 @@ macros \- useful macros .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 ");" @@ -64,6 +66,18 @@ and the result of gluing these tokens together must be valid 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 diff --git a/utils/macros.h b/utils/macros.h index 5f432f7..9e27a48 100644 --- a/utils/macros.h +++ b/utils/macros.h @@ -34,6 +34,8 @@ /*----- Header files ------------------------------------------------------*/ +#include + #ifndef MLIB_COMPILER_H # include "compiler.h" #endif @@ -48,6 +50,13 @@ #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 --- */ -- 2.11.0