Permalink
Browse files

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 <assert.h>, as that is where C1x will provide it.
  • Loading branch information...
1 parent 6af816b commit af67361bf29d165214c3f0f40571137a9b525c6d @markokr markokr committed Apr 5, 2012
Showing with 23 additions and 0 deletions.
  1. +2 −0 test/compile.c
  2. +21 −0 usual/base.h
View
@@ -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);
View
@@ -43,6 +43,7 @@
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
+#include <assert.h>
#ifdef WIN32
#include <usual/base_win32.h>
@@ -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 <usual/logging> module */
#ifndef Assert
#ifdef CASSERT

0 comments on commit af67361

Please sign in to comment.