Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 30 Sep 2008 15:55:26 -0400
From:      "Ryan Stone" <rysto32@gmail.com>
To:        freebsd-current@freebsd.org
Subject:   Possible alternate definition of CTASSERT to allow its use in header files
Message-ID:  <bc2d970809301255n2a4517b0m88104462e40fb211@mail.gmail.com>

next in thread | raw e-mail | index | archive | help
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?



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?bc2d970809301255n2a4517b0m88104462e40fb211>