Mail Archives: djgpp/2003/04/21/08:00:03
Gisle Vanem wrote:
>
> "Eric Sosman" <esosman AT acm DOT org> said:
>
> > > #include <stdarg.h>
> > > char x;
> > > void foo (va_list arg)
> >
> > Hold on; stop right there. You've included <stdarg.h>, but you're
> > using the argument list declaration from the pre-Standard <varargs.h>
> > (or <vararg.h> with some compilers). The two are not the same, they
> > are not interchangeable, and they are *definitely* not miscible.
>
> You mean using "va_list" is pre-standard? (it's used in <stadarg.h>)
> That's funny since djgpp uses it all the time. Have a look at e.g.
> src\libc\ansi\stdio\doprnt.c.
My apologies; Richard Dawe pointed out my error. <stdarg.h> uses
some of the same names as the pre-Standard <varags.h>, and I mis-read
the usage you quoted.
> > > x = va_arg (arg, char);
> >
> > This will be wrong with either <stdarg.h> or <varargs.h>, since
> > the actual type of the parameter is not `char' but whatever `char'
> > gets promoted to: `int' on most machines, but perhaps `unsigned int'
> > on some oddball architectures. You must specify the promoted type,
> > not the type to which you will later "demote" it.
>
> Yes, I know. I use "x = (char) va_arg(arg,int)" to stop gcc complaining.
> But my question is why the "int $5" is generated. [...]
No idea. The code as it stands (with `char' instead of `int') *is*
incorrect, and the implementation of <stdarg.h> is necessarily
"magical."
We've all heard stories of the unexpected and usually unwelcome things
that happen when sorcerers mis-pronounce their incantations; perhaps the
mysterious `int $5' is one such consequence. If it goes away when the
va_arg() call is corrected, I think that's a practical resolution to the
problem.
--
Eric Sosman
esosman AT acm DOT org
- Raw text -