Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10.2 9/5/84; site ssc-vax.UUCP Path: utzoo!linus!decvax!bellcore!petrus!sabre!zeta!epsilon!gamma!ulysses!mhuxr!mhuxt!houxm!vax135!cornell!uw-beaver!fluke!ssc-vax!savage From: savage@ssc-vax.UUCP (Lowell Savage) Newsgroups: net.lang.c Subject: Re: Forward Referencing of Static Variables OK? Message-ID: <268@ssc-vax.UUCP> Date: Mon, 7-Oct-85 21:21:10 EDT Article-I.D.: ssc-vax.268 Posted: Mon Oct 7 21:21:10 1985 Date-Received: Thu, 10-Oct-85 07:17:06 EDT References: <365@tekcbi.UUCP> Organization: Boeing Aerospace Co., Seattle, WA Lines: 53 > A C compiler we are using was designed in such a way that the following > code would not compile: > extern int thing; /* don't know yet if thing is static or not */ > main() {...} > static int thing = 0; /* now we know that it's static */ > int increment(x)... > Now the situation is basically this: the compiler complains because > "thing" is first declared external int, referenced (as extern int) and > then declared (the designers say "re-declared") static int after the > reference. > > Their contention that not allowing this type of forward referencing of > static variables is consistent with "The C Programming Language", (K. & P.). > What say you all? Is there any language in K & P which would dissuade them? > Thanks! > --Jim Prouty Tektronix, Inc From the way I read K&R, the "static" keyword is redundant, unless it is inside a function. In other words, "static int thing;" is equivalent to "int thing;" unless the declaration takes place inside a function. (Any comment on that??) Then, the "extern" keyword specifies that the variable declared is contained in some other program unit (usually outside the current function, but in this case, outside the current file). I have seen nothing in K&R that says that this variable can be redeclared inside the current program unit. In other words, if the compiler writer wants to be nice, he will let you redeclare it, but he/she does not have to. (Any further comments??) Personally, I would like to be able to do this myself on occasion. For instance I would like to put the "extern" declaration in an include file which is included in several source files, and then "redeclare" it in one of them. Also, I'd like to have the compiler then make sure that the two declarations are compatible (so I don't declare "thing" as a long int in the include file, and as a char in the code.) But what we really needed from K&R is a method of declaring variables outside of functions in include files so that these variables only need to be declared once. For instance, if file a.h has the declaration "int thing;", and a.h is included by b.c and c.c, does b.c access the same "thing" that c.c does? I don't think that K&R specify. And if the declaration is "extern int thing" then there must still be a further declaration of "thing" somewhere else. (Anybody got anything else to say???) Sorry it got so long. There's more than one way to be savage, Lowell Savage