X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fcfg%2Fcompiler.h;h=e8a76ab1af9e3fddb5af5bf8a753ab00fb670315;hb=da99e878a65f6ab84e51bdf4c9029c3906431b03;hp=07f4f14118e024456a4ccb73a1095c7b26fcb72f;hpb=5c77344df12ac768e7b53e0085ad08de21513d2f;p=bertos.git diff --git a/bertos/cfg/compiler.h b/bertos/cfg/compiler.h index 07f4f141..e8a76ab1 100644 --- a/bertos/cfg/compiler.h +++ b/bertos/cfg/compiler.h @@ -80,14 +80,25 @@ #define COUNT_PARMS(...) \ COUNT_PARMS2(11 , ## __VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) - #define FN_ARGS ... + /** + * usage: + * \code + * #define foo_init(...) PP_CAT(foo_init_, COUNT_PARMS(__VA_ARGS__)) (__VA_ARGS__) + * \endcode + */ #else #define COUNT_PARMS2(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _, ...) _ #define COUNT_PARMS(args...) \ COUNT_PARMS2(11 , ## args, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) - #define FN_ARGS args... + /** + * usage: + * \code + * #define foo_init(args...) PP_CAT(foo_init_, COUNT_PARMS(args)) (args) + * \endcode + */ + #endif #if defined(__IAR_SYSTEMS_ICC) || defined(__IAR_SYSTEMS_ICC__) @@ -475,8 +486,8 @@ typedef unsigned char sigmask_t; /**< Type for signal masks. */ typedef long ssize_t; #elif CPU_ARM || CPU_CM3 typedef int ssize_t; - #elif CPU_AVR - /* 16bit (missing in avr-libc's sys/types.h). */ + #elif CPU_AVR || CPU_MSP430 + /* 16bit (missing in avr-/msp430-libc's sys/types.h). */ typedef int ssize_t; #else #error Unknown CPU @@ -520,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 /**