From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Robert P. J. Day" Subject: Re: weird structure definition in header file Date: Tue, 6 Sep 2005 15:27:35 -0400 (EDT) Message-ID: References: <20050906192324.GA10879@hmsreliant.homelinux.net> Mime-Version: 1.0 Return-path: In-Reply-To: <20050906192324.GA10879@hmsreliant.homelinux.net> Sender: linux-c-programming-owner@vger.kernel.org List-Id: Content-Type: TEXT/PLAIN; charset="us-ascii" Content-Transfer-Encoding: 7bit To: nhorman@tuxdriver.com Cc: C programming list On Tue, 6 Sep 2005, nhorman@tuxdriver.com wrote: > On Tue, Sep 06, 2005 at 03:13:48PM -0400, Robert P. J. Day wrote: > > > > i'm looking at some legacy code and, in a header file, i find the > > following (paraphrased for brevity): > > > > typedef struct { > > ... stuff ... > > } Widgets ; > > > > extern Widgets Widget ; > > > > > > huh? i can see why a header file would want to define a structure > > but i'm confused why the *header* file would then refer to an external > > object of that type. that's a new one on me -- typically, i'd expect > > a *source* file to define such a thing and other *source* files to > > contain the "extern" declaration. > > > > is this some subtle programming cleverness of which i am unaware? > > thanks. > > > This is done quite frequently when a data structure needs to be > referenced from multiple locations. They're not necessicarily > consecutive like that, but its rather a common practice to extern a > instance of a type in a header file. The kernel source tree does > this very frequently, check include/net/ipv4 for lots of examples. ok, so what it represents is just a shortcut so that each source file doesn't have to have its own extern, it just comes along with the header file. all right, i guess i can live with that although it strikes me as just a little bit sleazy. oh, well. rday