IDesign имеет C#, кодирующий документ стандартов, который является наиболее часто используемым. Также посмотрите Руководство по проектированию Платформы 2-й Ed.
Не передавать результаты в 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 );
}
Я почти уверен, что вы ищете va_start ()
/ vprintf ()
/ vsnprintf ()
/ va_end ()
, нет необходимости реализовывать их самостоятельно.
Вы передадите значение arglist функции, предназначенной для его использования. Дополнительные сведения см. В документации по stdarg и vprintf.
Я (не в порядке) не знаком с тем, как это реализовать. Я бы посоветовал взглянуть на реализацию таких функций, как printf. Существует несколько реализаций с открытым исходным кодом. glibc, uclibc (не уверен, что bsd и opensolaris вызывают / используют для своей библиотеки libc).