Программирование на C: список аргументов прямой переменной - PullRequest
42 голосов
/ 12 ноября 2009

Я пытаюсь написать функцию, которая принимает переменное число параметров, таких как printf, делает некоторые вещи, а затем передает список переменных в printf. Я не уверен, как это сделать, потому что кажется, что он должен был бы поместить их в стек.

Примерно так

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;
}

Есть идеи?

Ответы [ 4 ]

53 голосов
/ 12 ноября 2009

Не передавайте результаты на printf. передать их на vprintf. vprintf специально существует для обработки передачи va_list аргументов. Со страницы руководства Linux:

#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);

Обратите внимание, как последние явно принимают va_list аргументы, такие как аргументы, которые вы объявляете внутри функции, принимающей ... в списке параметров. Итак, ваша функция будет объявлена ​​так:

void forward_args( const char *format , ... ){
   va_list arglist;
   va_start( arglist, format );
   vprintf( format, arglist );
   va_end( arglist );
}
4 голосов
/ 12 ноября 2009

Я почти уверен, что вы ищете va_start() / vprintf() / vsnprintf() / va_end(), нет необходимости реализовывать их самостоятельно.

2 голосов
/ 12 ноября 2009

Вы будете передавать значение arglist в функцию, предназначенную для его использования. Обратитесь к документации по stdarg и vprintf для получения дополнительной информации.

0 голосов
/ 12 ноября 2009

Я не знаю, как реализовать это. Я бы посоветовал взглянуть на реализацию таких функций, как printf. Существует несколько реализаций с открытым исходным кодом. glibc, uclibc (не уверен, что bsd и opensolaris называют / используют для своих libc).

...