Variable length arg lists for macros
    Paul Gluckauf Haahr 
    haahr at phoenix.Princeton.EDU
       
    Thu Sep  8 08:07:25 AEST 1988
    
    
  
> How do people feel about the idea of preprocessor macros with variable
> length argument lists ?
> 
> However this can not be done with macro calls. Wouldn't it be nice to be
> able to do something like ...
> 
> 
> 	#ifdef TRACE
> 	#define	tracef(s,...)	printf(s,...)
> 	#else
> 	#define	tracef(s,...)	/* nothing */
> 	#endif
> 
> At present, this CANNOT BE DONE, without nesting parentheses (clumsy) or
> using a call to an empty function (inefficient, unless you have inline
> integration in an optimizing compiler).
well, if your trace function has no more arguments than printf,
you can always do
	#ifdef	TRACE
	#define	tracef	printf
	#else
	#define	tracef	1 ? 0 :
	#endif
note the complete absence of parenthese.  if you want arguments,
the syntax gets ugly, but can work.  for example,
	#ifdef	TRACE
	#define	trace(n)	(debug > n) ? 0 : printf
	#else
	#define	trace(n)	1 ? 0 :
	#endif
usage is then
	trace(3)("n = %d\n", n)
making that print to stderr probably requires an additional function
call, but only when tracing is enabled.
[ this trick is not my own.  peter honeyman (now umix!honey) showed me
a variant in 1984 that is in the hdb uucp sources, used to implement
logging for uucico -x<number> ]
paul haahr
princeton!haahr		haahr at princeton.edu
    
    
More information about the Comp.std.c
mailing list