These problems are perhaps regrettable, but we don't know any practical way around them.
int foo (struct mumble *); struct mumble { ... }; int foo (struct mumble *x) { ... }This code really is erroneous, because the scope of
struct
mumble
in the prototype is limited to the argument list containing it.
It does not refer to the struct mumble
defined with file scope
immediately below--they are two unrelated types with similar names in
different scopes.
But in the definition of foo
, the file-scope type is used
because that is available to be inherited. Thus, the definition and
the prototype do not match, and you get an error.
This behavior may seem silly, but it's what the ANSI standard specifies.
It is easy enough for you to make your code work by moving the
definition of struct mumble
above the prototype. It's not worth
being incompatible with ANSI C just to avoid an error for the example
shown above.
include
; then do
`make install' again.
double
in memory.
Compiled code moves values between memory and floating point registers
at its convenience, and moving them into memory truncates them.
You can partially avoid this problem by using the `-ffloat-store'
option (see section Options That Control Optimization).