[net.lang.c] adr of static fns

cottrell@nbs-vms.ARPA (02/05/85)

/*
> This is a discussion of a C semantics issue which I have not seen discussed
> on the net, or elsewhere.
> 
> The original question was, "Is it OK to take the address of a >>static<<
> function, and pass it to a separately-compiled function?"
> 
> Saying the answer is "no" appears to allow the compiler to take advantage of
> the fact to optimize the calling sequence when data flow analyses, or whatever,
> indicate that the full calling sequence is not required.
> 
> Saying the answer is "yes" means that I don't have to declare the comparison
> function used deep inside an implementation of an abstract data type to be
> external, even though its only use is to pass its address to "qsort", and it
> shouldn't be visible to any of the users of the data type.
> 
> These arguments can be presented in various other ways, which I will omit.
> 
> This problem arose practically in Version 2.0 of the Venix system for the
> IBM PC/XT, in their kludge to support large programs.  (The kludge is not
> Venturecom's fault - they have actually done a goood job of supporting large
> programs on a brain-damaged machine.)  However, they require a special form
> of call for inter-segment calls, which they do not use for static calls, since
> they are guaranteed to remain within a single segment.  This is of course only a
> special case of the optimizations which may be possible.
> 
> In reality, the answer might have to be "yes", making the Venix code in error.
> The reason is that a function may invoke another function by address. That
> function may be a static function in the same module or an external function in
> a separate module - unless the compiler gets very tricky, it will have to use
> the full calling sequence.  Therefore, optimization may only be permitted for
> functions which do not have their addresses taken.
> 
> Regardless of your views on all this, if you are really trying to write
> portable C code, don't pass the addresses of static functions around.

Why is a static funxion any different then a `regular' one? As far as I
know, all `static' does is make the name local to the file it appears in.
What am I missing?
*/