+ #if defined(__GNUC__) && !defined(__cplusplus)
+ /*
+ * Perform a compile time type checking: countof() can only
+ * work with static arrays, so throw a compile time error if a
+ * pointer is passed as argument.
+ *
+ * NOTE: the construct __builtin_types_compatible_p() is only
+ * available for C.
+ */
+ #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