Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP
Path: utzoo!mnetor!seismo!brl-adm!rutgers!ames!ucbcad!ucbvax!decvax!ima!haddock!karl
From: karl@haddock.UUCP (Karl Heuer)
Newsgroups: comp.lang.c
Subject: Forward declarations
Message-ID: <298@haddock.UUCP>
Date: Sun, 11-Jan-87 18:43:07 EST
Article-I.D.: haddock.298
Posted: Sun Jan 11 18:43:07 1987
Date-Received: Sun, 11-Jan-87 23:38:35 EST
Reply-To: karl@haddock.isc.com.UUCP (Karl Heuer)
Distribution: world
Organization: Interactive Systems, Boston
Lines: 39
Keywords: extern, static

About a month ago I pointed out that the three keywords "static", "extern",
and "" (the empty string (not really a keyword, of course) denoting the lack
of a storage-class specifier) only cover three of the four elements in the
Cartesian product of { local, global } with { declare, define }, and I asked
whether there were a portable way to make a forward declaration of a static
object.  (I've been using "extern" for this, but I wondered if that really
works on all compilers.)

One e-mail reply pointed out that a one-pass compiler might output linker
information immediately, which would then go unresolved at load time.  I think
a recent posting on another subject also mentioned the possibility that, in
the code fragment "extern int x; int *y = &x; static int x;" (which is what I
am currently using) the interpretation may be (perhaps even should be) that
there is a global x in some other file (distinct from the local one in this
file).

If anyone uses or knows of such a braindamaged compiler, I'd be interested in
knowing how one *does* achieve a forward declaration using it.

Someone asked why I don't just move the definition to the top of the file.  In
the first place, this discussion applies (to a lesser extent) to functions as
well as variables, and although I often use that bottom-up style voluntarily I
don't want to be forced into it.  In the second place, the suggestion doesn't
handle the recursive case -- which can occur with data as well:
	static struct Linkedlist x = { &y, ... };
	static struct Linkedlist y = { &x, ... };

Tony Hansen said he believes ANSI has blessed this use of "extern".  My copy
(May86) is a bit muddy on this point, but they talk about something new they
call a "tentative definition" (which is either a declaration or a definition,
depending on future context); unfortunately, I want something that will work
on current compilers too.

Does the current proposal explicitly allow "extern int x; ... static int x;"
with the intended semantics?

Karl W. Z. Heuer (ima!haddock!karl or karl@haddock.isc.com), The Walking Lint
(If K&R had made three independent keywords, "static", "global", and "define",
the resulting language would have been simpler, despite having more words!)