gcc varargs problem

whoosh whoosh777 at blueyonder.co.uk
Fri Aug 1 21:37:55 UTC 2008


On 01-Aug-08 15:00:59 Steven W. Orr wrote:
>On Thursday, Jul 31st 2008 at 21:36 -0000, quoth whoosh:

>=>
>=>all gcc's so far have accepted the following code,
>=>
>=>until now using gcc on Fedora 9:
>=>
>=>
>=>void f( va_list *pargs )
>=>{
>=>va_list args = *pargs ;
>=>...
>=>}
>=>
>=>64 bit Fedora 9's gcc regards this as an error, all the other gcc's eg 
>=>on 32 bit Fedora Core 3 have no problem with this.
>=>
>=>
>=>I use this a lot in order to pass var args to another function.
>=>eg I have recursive functions which take variable numbers of args
>=>and redirect to user supplied functions to process those args.
>=>
>=>
>=>for porting code I dont want to have to rewrite everything,
>=>
>=>
>=>also the gcc gives endless signedness warnings because my
>=>code uses 
>=>
>=>unsigned char *
>=>
>=>instead of
>=>
>=>char *
>=>
>=>for strings, I do that because I need to guarantee that chars are unsigned,
>=>
>=>in order to avoid the ambiguity of EOF versus 255.

>Do not use varargs. Use stdargs. Convert any code that uses varargs to use 
>stdargs. See man 3 stdarg.

I have changed it to:

va_list args ;

va_copy( args, *pargs ) ;

which compiles and functions correctly.

However earlier gcc's DONT recognise va_copy(), thus I need

#if defined( __please_ignore_va_copy__ )
args = *pargs ;
#else
va_copy( args, *pargs ) ;
#endif

note that when I do "args = *pargs ; " I am merely assuming that

"args" is a pointer, thus "args = *pargs ; " is fine,

its only a problem if args is an aggregate.

typedef struct anything_at_all *va_list ;


f( va_list *pargs )
{
va_list args = *pargs ;

}

is completely fine provided va_list is a pointer.








>-- 
>Time flies like the wind. Fruit flies like a banana. Stranger things have 
.0.
>happened but none stranger than this. Does your driver's license say Organ
..0
>Donor?

>Black holes are where God divided by zero.

thats the best explanation I have heard!

> Listen to me! We are all- 000
>individuals! What if this weren't a hypothetical question?
>steveo at syslang.net






More information about the fedora-list mailing list