Date: Tue, 27 Jan 2009 23:59:15 +0100 From: Christoph Mallon <christoph.mallon@gmx.de> To: Luigi Rizzo <rizzo@iet.unipi.it> Cc: current@freebsd.org Subject: Re: duplicate typedefs and system headers ? Message-ID: <497F91C3.7040502@gmx.de> In-Reply-To: <20090127132102.GA21574@onelab2.iet.unipi.it> References: <20090127132102.GA21574@onelab2.iet.unipi.it>
next in thread | previous in thread | raw e-mail | index | archive | help
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. > Sources including both ipfw2.h and /usr/include/netinet/ip_fw2.h > However if the duplication occurs in two non-system files, the > compiler produces an error for a duplicate typedef. > > Now i wonder, is there any compiler option to turn off the check > for duplicate typedefs also for non-system headers ? No. C forbids multiple typedefs of with the same name, even if they are typedefs for the same type. (Side note: C++ allows this.) > BTW the behaviour with duplicate typedefs is curious, > you can try this for yourself with a simple example > involving e.g. /usr/include/sha.h : make a copy of the file > in userspace, and then you can try the following (SHA_CTX > is typedef'ed in sha.h > > --- ok --- > typedef struct SHAstate_st SHA_CTX; > #include <sha.h> > > --- ok --- > #include <sha.h> > typedef struct SHAstate_st SHA_CTX; > > --- error --- > #include "sha.h" > typedef struct SHAstate_st SHA_CTX; > > --- error --- > typedef struct SHAstate_st SHA_CTX; > #include "sha.h" > > --- ok (this is surprising to me) -- > typedef struct SHAstate_st SHA_CTX; > #include <sha.h> > typedef struct SHAstate_st SHA_CTX; > > As you note, it looks like a typedef in a system header > removes the error message for duplicates both before and after. This is a misfeature in GCC and violates the C standard. Also it seems that this misfeature has a bug, too, because it does not only affect system headers, but the effects radiate into normal code, too. Regards Christoph
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?497F91C3.7040502>