Possible alternate definition of CTASSERT to allow its use in header files

Ryan Stone rysto32 at gmail.com
Tue Sep 30 20:23:34 UTC 2008


This was prompted by some recent check-ins removing CTASSERTs from
header files to prevent spurious errors from popping up.  For example,
this check-in:
http://lists.freebsd.org/pipermail/cvs-src/2008-September/095328.html

I've come up with an alternate definition of CTASSERT that can be used
in header files.  It works on gcc 3.4.6, 4.0.2 and 4.3.0(the only
compilers I have quick access to).

$ cat /tmp/tmp.c
// New definition
#define NEWASSERT(x) _NEWASSERT(x, __LINE__)
#define _NEWASSERT(x, line) __NEWASSERT(x, line)
#define __NEWASSERT(x, line) extern int __assert_ ## line [ x ? 1 : -1 ];

//existing BSD implementation
#define CTASSERT(x)             _CTASSERT(x, __LINE__)
#define _CTASSERT(x, y)         __CTASSERT(x, y)
#define __CTASSERT(x, y)        typedef char __assert ## y[(x) ? 1 : -1]

CTASSERT(1);                                      // line 11
CTASSERT(0);                                      // line 12
CTASSERT(1); CTASSERT(0);                // line 13


NEWASSERT(1);                                   // line 16
NEWASSERT(0) ;                                  // line 17
NEWASSERT(1); NEWASSERT(0);        // line 18
NEWASSERT(1); NEWASSERT(1);        // line 19


$ gcc -v -c /tmp/tmp.c -Wall -Werror
/tmp/tmp.c:12: error: size of array `__assert12' is negative
/tmp/tmp.c:13: error: size of array `__assert13' is negative
/tmp/tmp.c:13: error: redefinition of typedef '__assert13'
/tmp/tmp.c:13: error: previous declaration of '__assert13' was here
/tmp/tmp.c:17: error: size of array `__assert_17' is negative
/tmp/tmp.c:18: error: size of array `__assert_18' is negative
$

Note that the compiler doesn't complain about multiple definitions of
__assert18 and __assert19 like it does about the multiple definitions
of __assert13, which is the reason that CTASSERTs can't be used in
header files.

Thoughts?  Will this work on compilers other than gcc?


More information about the freebsd-current mailing list