* NOTE: the construct __builtin_types_compatible_p() is only
* available for C.
*/
- #define countof(a) (sizeof(a) / sizeof(*(a)) + \
- sizeof(typeof(int[1 - 2 * \
- !!__builtin_types_compatible_p(typeof(a), \
- typeof(&a[0]))])) * 0)
+ #define countof(a) (sizeof(a) / sizeof(*(a)) + \
+ STATIC_ASSERT_EXPR( \
+ !__builtin_types_compatible_p( \
+ typeof(a), typeof(&a[0]))))
#else
#define countof(a) (sizeof(a) / sizeof(*(a)))
#endif
#define STATIC_ASSERT(condition) \
UNUSED_VAR(extern char, STATIC_ASSERTION_FAILED__[(condition) ? 1 : -1])
+/**
+ * Issue a compilation error if \a __cond is false (this can be used inside an
+ * expression).
+ */
+#define STATIC_ASSERT_EXPR(__cond) \
+ (sizeof(struct { int STATIC_ASSERTION_FAILED__:!!(__cond); }) * 0)
+
#ifndef ASSERT_TYPE_EQUAL
/** Ensure two variables have the same type. */
#define ASSERT_TYPE_EQUAL(var1, var2) \