C Programming: Forward variable argument list

24,710

Solution 1

Don't pass the results to printf. pass them to vprintf. vprintf specifically exists to handle passing in va_list arguments. From the Linux man page:

#include <stdio.h>

int printf(const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);
int sprintf(char *str, const char *format, ...);
int snprintf(char *str, size_t size, const char *format, ...);

#include <stdarg.h>

int vprintf(const char *format, va_list ap);
int vfprintf(FILE *stream, const char *format, va_list ap);
int vsprintf(char *str, const char *format, va_list ap);
int vsnprintf(char *str, size_t size, const char *format, va_list ap);

Notice how the latter explicitly take va_list arguments such as the ones you declare inside a function taking ... in the parameter list. So your function would be declared like this:

void forward_args( const char *format , ... ){
   va_list arglist;
   va_start( arglist, format );
   vprintf( format, arglist );
   va_end( arglist );
}

Solution 2

I'm pretty sure you're looking for va_start() / vprintf() / vsnprintf() / va_end(), there's no need to implement these yourself.

Share:
24,710
CanadianGirl827x
Author by

CanadianGirl827x

Updated on August 17, 2020

Comments

  • CanadianGirl827x
    CanadianGirl827x almost 4 years

    I'm trying to write a function that accepts a variable number of parameters like printf, does some stuff, then passes the variable list to printf. I'm not sure how to do this, because it seems like it would have to push them onto the stack.

    Something approximately like this

    http://pastie.org/694844

    #include <stdio.h>
    #include <stdarg.h>
    
    void forward_args( const char *format , ... ){
      va_list arglist;
      printf( format, arglist );
    }
    
    
    int main (int argc, char const *argv[]){
      forward_args( "%s %s\n" , "hello" , "world" );  return 0;
    }
    

    Any ideas?

  • Ken Bloom
    Ken Bloom over 14 years
    Well, he needs to va_start() and va_end() also.
  • quark
    quark over 14 years
    @Ken Bloom: Oof. I thought I fixed that. Moral: Don't write code tired, even code you are just cutting and pasting. Thanks for catching that.
  • CanadianGirl827x
    CanadianGirl827x over 14 years
    Hi, Ken, I saw your name and had to think for about 15 minutes to figure out where I recognized it from... I've seen you on the Ruby mailing list ^_^ Thanks for the help, both Ken and quark.