duplicate typedefs and system headers ?

Luigi Rizzo rizzo at iet.unipi.it
Tue Jan 27 15:15:32 PST 2009


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


More information about the freebsd-current mailing list