Date: Wed, 28 Jan 2009 00:21:03 +0100 From: Luigi Rizzo <rizzo@iet.unipi.it> To: Christoph Mallon <christoph.mallon@gmx.de> Cc: current@freebsd.org Subject: Re: duplicate typedefs and system headers ? Message-ID: <20090127232103.GA40501@onelab2.iet.unipi.it> In-Reply-To: <497F91C3.7040502@gmx.de> References: <20090127132102.GA21574@onelab2.iet.unipi.it> <497F91C3.7040502@gmx.de>
next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, Jan 27, 2009 at 11:59:15PM +0100, Christoph Mallon wrote:
> Luigi Rizzo schrieb:
> >In a recent commit tp sbin/ipfw, in an attempt to avoid
> >a large set of header deependencies, i put a 'forward typedef'
> >declaration in a common header, duplicating something that is in a
> >system header:
> >
> >ipfw2.h: typedef struct _ipfw_insn ipfw_insn;
> >
> >netiinet/ip_fw2.h
> > typedef struct _ipfw_insn { /* template for instructions */
> > ...
> > } ipfw_insn;
>
> This just begs to break, if somebody decides to change the name of the
> underlying type of the typedef.
Fortunately this is almost impossible -- the system header is
basically frozend and if I could change it I would remove the
typedef in the first place.
I am more worried of compatibility with different compiler.
A workaround that seems to work is putting forward declarations
just for "struct _ipfw_insn" and use it (instead of the typedef
name) in the place that does not include netiinet/ip_fw2.h
Would this be better/more compliant with standards -- i.e.,
is the following code correct ? gcc seems to have no objections.
struct foo;
int a(struct foo *);
typedef struct foo bar;
int a(bar *x) { ... }
cheers
luigi
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20090127232103.GA40501>
