2009-11-12 5 views
39

printf와 같은 다양한 변수를 받아들이고 몇 가지 작업을 한 다음 printf에 변수 목록을 전달하는 함수를 작성하려고합니다. 나는 이것을 어떻게해야할지 모르겠다. 스택에 밀어 넣어야 할 것처럼 보이기 때문이다. 약이C 프로그래밍 : 가변 인수 목록 전달

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

아마 당신과 존은 같은 등급입니까? http://stackoverflow.com/questions/1714550/how-can-one-variable-args-function-call-another –

+2

[C에서 가변 인자 함수 호출을 전달할 수 있습니다] (http://stackoverflow.com)/questions/150543/forward-an-a-variadic-function-in-c) – dmckee

답변

49

결과를 printf으로 전달하지 마십시오. 그들을 vprintf에 전달하십시오. vprintf은 특히 va_list 인수를 전달하는 것을 처리하기 위해 존재합니다. 후자는 명시 적 당신이 매개 변수 목록에 ...을 복용 함수 내에서 선언 사람으로 va_list 인수를 어떻게

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

주의 사항 : 리눅스 man 페이지에서. 그래서 당신의 기능은 다음과 같이 선언 될 것입니다 :

void forward_args(const char *format , ...){ 
    va_list arglist; 
    va_start(arglist, format); 
    vprintf(format, arglist); 
    va_end(arglist); 
} 
+1

글쎄, 그는'va_start()'와'va_end()'도 필요합니다. –

+0

@Ken Bloom : 당신 말이 맞아요. 결정된. – quark

+4

'va_start (arglist, format)' –

2

당신은 arglist 값을 소비하도록 설계된 함수에 전달할 것입니다. 더 많은 단서는 stdarg 및 vprintf 설명서를 참조하십시오.

-1

저는 이것을 구현하는 방법에 익숙하지 않습니다. 나는 printf와 같은 함수의 구현을 살펴볼 것을 제안한다. 몇 가지 오픈 소스 구현이 존재합니다. glibc, uclibc (bsd 및 opensolaris가 libc를 호출/사용하는지 확실하지 않음).

3

난 당신이 va_start()/vprintf()/vsnprintf()/va_end() 찾고있는 확신이 자신을 구현 할 필요가 없습니다.