X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fcfg%2Fcompiler.h;h=e8a76ab1af9e3fddb5af5bf8a753ab00fb670315;hb=493d98f6f007571506feb2d6b4250b63e2edc7e1;hp=907b23e6d1749cf496a675937e580898d1ee0f73;hpb=a3f9ca9d86b7f8da31204746cc32e13c2dbe5ed0;p=bertos.git diff --git a/bertos/cfg/compiler.h b/bertos/cfg/compiler.h index 907b23e6..e8a76ab1 100644 --- a/bertos/cfg/compiler.h +++ b/bertos/cfg/compiler.h @@ -531,7 +531,22 @@ typedef unsigned char sigmask_t; /**< Type for signal masks. */ * * \note This macro is non-standard, but implements a very common idiom */ - #define countof(a) (sizeof(a) / sizeof(*(a))) + #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)) + \ + sizeof(typeof(int[1 - 2 * \ + !!__builtin_types_compatible_p(typeof(a), \ + typeof(&a[0]))])) * 0) + #else + #define countof(a) (sizeof(a) / sizeof(*(a))) + #endif #endif #ifndef alignof /**