Variable length arg lists for macros
    Peter Rowell 
    peter at thirdi.UUCP
       
    Fri Sep  2 05:04:26 AEST 1988
    
    
  
If the reason for variable arguments is to pass them to a routine
that takes varargs, the following horrible hack seems not only to
work but to be portable!
#define d_printf(level, stuff) ((level>=debug_level)? printf stuff :level=level)
                                   Note: NO parentheses --> ^     ^
This is then invoked by:
    d_printf(8, ("foo overflow: %d > %d", some_foo, max_foo));
		^ <----- Note the parentheses -----------> ^
By placing parentheses around the args for printf, they become 1 arg
from the point of view of the macro expander.  The reason for the ?: usage
is to allow this "if" anywhere a single expression could be without
screwing up things like:
    if (cond) d_printf(x,("bummer")); else somehthingelse;
----------------------------------------------------------------------
Peter Rowell				(You will need a bigger rock.)
Third Eye Software, Inc.		(415) 321-0967
Menlo Park, CA  94025			...!pyramid!thirdi!peter
    
    
More information about the Comp.std.c
mailing list