X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fcfg%2Fcompiler.h;h=0121b96367fe067cc98ba9a92004356c05ef56a5;hb=bfe473a7e8951b16edbd6559b828a37e6ce378aa;hp=e8a76ab1af9e3fddb5af5bf8a753ab00fb670315;hpb=59ed30d944d4ec2bd41675f64a4cedeb26d2f8b2;p=bertos.git diff --git a/bertos/cfg/compiler.h b/bertos/cfg/compiler.h index e8a76ab1..0121b963 100644 --- a/bertos/cfg/compiler.h +++ b/bertos/cfg/compiler.h @@ -209,6 +209,7 @@ #define RESTRICT __restrict__ #define MUST_CHECK __attribute__((warn_unused_result)) #define PACKED __attribute__((packed)) + #define ALIGNED(x) __attribute__ ((__aligned__(x))) #if CPU_ARM | CPU_CM3 #define NAKED __attribute__((naked)) #else @@ -360,6 +361,9 @@ #ifndef PACKED #define PACKED /* nothing */ #endif +#ifndef ALIGNED +#define ALIGNED /* nothing */ +#endif #ifndef MEMORY_BARRIER #define MEMORY_BARRIER /* nothing */ #warning No memory barrier defined for select compiler. If you use the kernel check it. @@ -540,10 +544,10 @@ typedef unsigned char sigmask_t; /**< Type for signal masks. */ * 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 @@ -580,6 +584,13 @@ typedef unsigned char sigmask_t; /**< Type for signal masks. */ #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) \