C Programming: Forward variable argument list

随声附和 提交于 2019-11-26 06:39:17

问题


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?


回答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 );
}



回答2:


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




回答3:


You'll be passing along the arglist value to a function designed to consume it. See the stdarg and vprintf documentation for more clues.




回答4:


I'm not (off the top of my head) familiar with how to implement this. I would suggest looking at an implementation of functions like printf. Several open source implementations exist. glibc, uclibc (not sure what bsd and opensolaris call/use for their libc).



来源:https://stackoverflow.com/questions/1719784/c-programming-forward-variable-argument-list

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!