Re: Safer determination of static array size

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Linux kernel does it this way:

/* Force a compilation error if condition is true, but also produce a
   result (of value 0 and type size_t), so the expression can be used
   e.g. in a structure initializer (or where-ever else comma expressions
   aren't permitted). */
#define BUILD_BUG_ON_ZERO(e) (sizeof(char[1 - 2 * !!(e)]) - 1)

/* &a[0] degrades to a pointer: a different type from an array */
#define __must_be_array(a) \
   BUILD_BUG_ON_ZERO(__builtin_types_compatible_p(typeof(a), typeof(&a[0])))

#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))


On Fri, Aug 9, 2013 at 1:50 PM, Florian Weimer <fweimer@xxxxxxxxxx> wrote:
> On 08/09/2013 02:49 PM, Marcin Sobieszczanski wrote:
>>
>> What about a template function:
>>
>> template<typename T, size_t SZ> size_t ARRAY_SIZE( T (&a) [SZ] ) {
>> return SZ; }
>
>
> Yes, that's a good approach for C++ code, but a lot of code I'm dealing with
> only compiles as C.
>
>
> --
> Florian Weimer / Red Hat Product Security Team




[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux