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>

index | next in thread | raw e-mail

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?


help

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