[comp.lang.c++] Mixing C++ with ANSI C

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!"