From af67361bf29d165214c3f0f40571137a9b525c6d Mon Sep 17 00:00:00 2001 From: Marko Kreen Date: Thu, 5 Apr 2012 17:01:27 +0300 Subject: [PATCH] base: static_assert(expr, msg) Provide static_assert() macro. On newer compilers it tries to use built-in implementation, on older ones compat one. The detection does not need to be too strict as there is always fallback implementation available. Include , as that is where C1x will provide it. --- test/compile.c | 2 ++ usual/base.h | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/test/compile.c b/test/compile.c index c715981..a306513 100644 --- a/test/compile.c +++ b/test/compile.c @@ -39,6 +39,8 @@ int main(void) struct md5_ctx md5; char buf[128]; + static_assert(sizeof(int) >= 4, "unsupported int size"); + aatree_init(&aatree, NULL, NULL); cbtree = cbtree_create(NULL, NULL, NULL, USUAL_ALLOC); cbtree_destroy(cbtree); diff --git a/usual/base.h b/usual/base.h index 0846ff1..9f4d065 100644 --- a/usual/base.h +++ b/usual/base.h @@ -43,6 +43,7 @@ #include #include #include +#include #ifdef WIN32 #include @@ -171,6 +172,26 @@ /* @} */ + +/** + * Compile-time assert. + * + * Expression must be evaluatable at compile time. + * If false, stop compilation with message. + * + * It can be used in either global or function scope. + */ +#ifndef static_assert +#if _COMPILER_GNUC(4,6) || _COMPILER_CLANG(3,0) || _COMPILER_MSC(1600) +/* Version for new compilers */ +#define static_assert(expr, msg) _Static_assert(expr, msg) +#else +/* Version for old compilers */ +#define static_assert(expr, msg) enum { CONCAT4(static_assert_failure_, __LINE__, _, __COUNTER__) = 1/(1 != (1 + (expr))) } +#endif +#endif /* !static_assert */ + + /** assert() that uses module */ #ifndef Assert #ifdef CASSERT -- 2.39.5