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;
}
Любые идеи?
Ответы
Ответ 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).