extern int f(); VS int f();
Doug Gwyn
gwyn at smoke.BRL.MIL
Sun Feb 11 13:58:47 AEST 1990
In article <2912 at hcx1.SSD.CSD.HARRIS.COM> brad at SSD.CSD.HARRIS.COM (Brad Appleton) writes:
>Are the following function declarations equivalent?
>(1) extern int foo();
>(2) int foo();
>When would I use (1) and not (2) (and vice-versa)?
>Is this dependent on the Compiler Vendor?
>Is the answer different between ANSI-C and non-ANSI C?
This is a messy issue, because existing implementations differed in this.
The Standard situation for functions is simpler than for objects; the
latter involves the notion of "tentative definition" as well as linkage.
I'm just going to explain linkage here.
First, be sure you know the difference between object (data) and function.
Next, recall that there are four scopes of identifier visibility:
function-scope (labels only)
function-prototype scope (parameters in declarations only)
file-scope (declared outside blocks)
block-scope (declared inside a block, also parameters in
definitions)
Inner declarations can hide outer ones until the inner scope terminates.
Finally, linkage is determined as follows:
if not object and not function
or function parameter
or block-scope and object and not specified "extern"
then no linkage; done
fi
if function and no storage-class-specifier
then set storage-class-specifier to "extern"; proceed
fi
if specified "extern" { object or function }
then if there was a visible file-scope declaration
then linkage is same as visible file-scope's; done
else linkage is external; done
fi
fi
if file-scope
then case storage-class-specifier in
"static":
linkage is internal; done
none: { object }
linkage is external; done
esac
fi
If the same identifier has both internal and external linkage within
the same translation unit (source module including headers), the
behavior is undefined. If an identifier has no linkage, it is denotes
a unique entity. All instances of the same identifier with internal
linkage in the same translation unit denote the same object or function.
All instances of the same identifier with external linkage in the entire
program denote the same object or function.
Fortunately there is a simple set of rules the programmer can use to
avoid the "grey areas" of the linkage rules:
Always declare objects and functions that will be defined by
some other translation unit or library with explicit "extern".
Always define objects and functions that are published for
other translation units to use without a storage-class-specifier.
Always define functions and file-scope objects that are NOT
intended for use by other translation units with explicit "static".
If you're using a header file to define externally-visible
interfaces (a recommended practice), always use "extern" in its
object and function declarations (but not in type definitions).
>I am somewhat new to the net and would also appreciate some constructive
>feedback on whether this issue is worthy/appropriate for this newsgroup!
It's a legitimate question.
More information about the Comp.std.c
mailing list