Date: Thu, 26 May 2005 09:28:02 +0200 From: Stefan Farfeleder <stefan@fafoe.narf.at> To: Craig Rodrigues <rodrigc@crodrigues.org> Cc: freebsd-current@freebsd.org Subject: Re: [GCC 4.0 PATCH] devfs_vnops.c Message-ID: <20050526072801.GM596@wombat.fafoe.narf.at> In-Reply-To: <20050526020143.GA80396@crodrigues.org> References: <20050526020143.GA80396@crodrigues.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, May 25, 2005 at 10:01:43PM -0400, Craig Rodrigues wrote: > Hi, > > When I tried to compile src/sys/fs/devfs/devs_vnops.c > with GCC 4.0, I got the following compilation errors: > > /usr/src/sys/fs/devfs/devfs_vnops.c:1389: error: static declaration of 'devfs_vnodeops' follows non-static declaration > /usr/src/sys/fs/devfs/devfs_vnops.c:114: error: previous declaration of 'devfs_vnodeops' was here > /usr/src/sys/fs/devfs/devfs_vnops.c:1411: error: static declaration of 'devfs_specops' follows non-static declaration > /usr/src/sys/fs/devfs/devfs_vnops.c:115: error: previous declaration of 'devfs_specops' was here > > Apparently, it is not valid C to define something as extern > and then later on static in the same file, like: > > extern struct foo bar; > static struct foo bar = { .... }; Yes. > What do people think of the following patch to fix it? > > http://people.freebsd.org/~rodrigc/devfs_vnops.c.diff.txt Contrary to what Poul-Henning said, in this case it's perfectly legal to use: static struct foo bar; [...] static struct foo bar = { ... }; The first declaration is a tentative definition (it defines the object only if no `real' definition with an initialiser is found), the second declaration defines the object bar. There is only a problem if bar had array type and bar's initialiser was used to define the array size, because then the tentative definition static struct foo bar[]; would be illegal since bar has an incomplete type (6.9.2#3). Stefan
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20050526072801.GM596>