From 0d54568b4dea51b7b4d78b66680632ac792efd4e Mon Sep 17 00:00:00 2001 From: KOBAYASHI Shuji Date: Sun, 9 Aug 2020 20:39:36 +0900 Subject: Allow `mrb_static_assert()` to be used outside of functions The use of `struct` is an idea by @dearblue. --- include/mruby.h | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'include/mruby.h') diff --git a/include/mruby.h b/include/mruby.h index 5aced9ca7..8625d4521 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -68,9 +68,15 @@ # define mrb_static_assert(exp, str) static_assert(exp, str) #else /* C version of static_assert() */ -# define mrb_static_assert(cond, str) \ - do { int assertion_failed[(cond) ? 1 : -1];\ - (void) assertion_failed; } while(0) +# define _mrb_static_assert_cat0(a, b) a##b +# define _mrb_static_assert_cat(a, b) _mrb_static_assert_cat0(a, b) +# ifdef __COUNTER__ +# define _mrb_static_assert_id(prefix) _mrb_static_assert_cat(prefix, __COUNTER__) +# else +# define _mrb_static_assert_id(prefix) _mrb_static_assert_cat(prefix, __LINE__) +# endif +# define mrb_static_assert(exp, str) \ + struct _mrb_static_assert_id(_mrb_static_assert_) { char x[(exp) ? 1 : -1]; } #endif #define mrb_static_assert1(exp) mrb_static_assert(exp, #exp) -- cgit v1.2.3