Подтвердить что ты не робот

C Программирование: список аргументов переадресации

Я пытаюсь написать функцию, которая принимает переменное количество параметров, таких как 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;
}

Любые идеи?

4b9b3361

Ответ 1

Не передавать результаты в 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 );
}

Ответ 2

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

Ответ 3

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

Ответ 4

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