This might work for you, but you still have to use the (()) trick for all the additional parameters
Code:
#include <stdio.h>
#include <stdarg.h>
#define PRINTFX(x,y) \
fnCall( x, magic y )
void fnCall ( char *x, char *y ) {
printf( "%s %s\n", x, y );
}
char *magic ( const char *fmt, ... ) {
static char buff[BUFSIZ]; // must be static
va_list ap;
va_start ( ap, fmt );
vsprintf ( buff, fmt, ap );
va_end ( ap );
return buff;
}
int main ( ) {
PRINTFX( "One", ("This is one %d\n",1) );
PRINTFX( "Two", ("Nothing") );
return 0;
}