Passing values to functions

Doug Gwyn gwyn at brl-smoke.ARPA
Fri Feb 26 04:55:07 AEST 1988


In article <239 at mccc.UUCP> pjh at mccc.UUCP (Peter J. Holsberg) writes:
>Dumb question:  if in an assignment like
>		x = 3;
>where x is declared a double, the 3 is simply widened to the size of a
>double, why does this fail?
>		min = minimum( min, x );
>where
>		double minimum( double, double );

The key is, the conversion from int to double has to be done by code
generated by the compiler, which means that the compiler has to know
that it is needed.  If you haven't previously declared the function
prototype, or if you have declared it a la "old style":
	double minimum();
, or if you have declared it before the use of the function but your
compiler does not fully support (proposed) ANSI C rules for function
prototypes, then the types of the function parameters have no effect
on the code that is generated to pass the parameters to the function.
In such a case, the compiler will simply apply "default widening
conventions" (all integer types < long get widened to int, float to
double) to the parameters.  Then, on the other end the function is
always implemented by code that is prepared to receive the correct
(widened) parameter types; it never tries to perform further
conversions when picking up the parameters.  Therefore, the default-
widened type must agree with the type declared in the beginning of
the actual function definition.

The main reason for this rigamarole is to support separate compilation
of functions without having to pass type information (known in the
trade as "dope vectors") along with the data values for function
parameters.  In ANSI C as proposed, you'll be able to have function
prototypes in scope and thereby get the compiler to automatically
convert all parameters to matching types.  (Personally I don't think
this is a good idea.)



More information about the Comp.lang.c mailing list