chmilar@cpsc.ucalgary.ca (Michael Chmilar) (03/07/89)
I have recently ported the AT&T C++ translator to a machine that has a pseudo-ANSI C compiler (the SGI Iris-4D/20). A problem has arisen due to the interaction of the two compilers. The essence of the problem is this: A header file is given to C++ with this declaration: void ortho( float, float, float, float, float, float ); The C code generated has the prototype stripped out: void ortho(); When ortho is called in the C++ code: ortho( -2.0, 2.0, -2.0, 2.0, -2.0, 2.0 ); the C code is this: ortho( (float)(-2.0), (float)2.0, (float)(-2.0), [...] ); but, in fact, the parameters will be converted to doubles before being passed, as is expected. However, ANSI C specifies that if the parameters are declared as "float" in a function prototype, they will be passed as single-precision floats! In the example above, the arguments _should_ be passed as floats rather than as doubles. Because C++ removes the prototypes from the "ortho" declaration, they are passed as doubles. Has anyone found a way to circumvent this problem in a nice way? I have resorted to putting "wrappers" around the offending functions to get the arguments passed correctly. I have also tried a nasty kludge where I pass a struct containing one float - this doesn't work due to a difference between floating point and general-purpose registers on the 4D. What I would really like is to have the C++ translator spit out the function prototypes intact; there does not appear to be a compiler switch to accommodate this, and I don't want to start hacking on the code. Will this need be addressed in future releases of the C++ translator? If you have a solution to this dilemma, please send me some mail. Thank-you Michael Chmilar, University of Calgary, ..{ubc-cs,utai,alberta}!calgary!chmilar "What's your sign?" "It depends on my angle!"