2011-04-28 5 views
1

va_list를 다른 함수로 전달하고 싶습니다.어떻게 C90에서 함수를 통해 va_list를 전달할 수 있습니까?

void my_printf_1(char* string, ...){ 
    va_list ap; 
    va_start (ap, string); 
    printf(string, ap); 
    va_end(ap); 
} 

void my_printf_2(char* string, ...){ 
    va_list ap; 
    va_start (ap, string); 
    printf(string, *ap); 
    va_end(ap); 
} 

void main(void){ 
    my_printf_1("Hello %i\n", 12); //Shows me the Pointer 
    my_printf_1("Hello \n"); //Runtime Error - too Many Arguments 
    my_printf_2("Hello %i\n", 12); //Displays correctly because 12 < char 
    my_printf_2("Hello %i\n", 500); //Displays incorrectly because 500 > char 
    my_printf_2("Hello %i %i\n", 12, 12); //Displays 12, then crashes Runtime Error not enough arguments 
    my_printf_2("Hello \n"); //Runtime Error - too Many Arguments 
} 

내가 전체 목록을 얻을 수있는 방법, 내 va_list apchar 포인터 나에게 보인다 여기에 내가 뭘하려고 오전의 예입니다? my_printf()을 전체 또는 가짜 va_list을 하위 함수로 전달하려면 어떻게 다시 작성할 수 있습니까? va_list 포인터를 받아들이도록 하위 함수를 수정할 수 없으므로 my_printf을 수정해야합니다.

편집 : 다음과 같이 작동한다는 것을 알고 있지만 이것이 내가 원하는 것은 아닙니다.

void my_printf_1(char* string, ...){ 
va_list ap; 
va_start (ap, string); 
vprintf(string, ap); 
va_end(ap); 
} 
+0

당신의 컴파일러 + 헤더는'va_list'를'char *'로 정의 할 수도 있지만 구현에 따라 다릅니다. 당신은'va_list '를'va_start','va_arg','va_copy','va_end'로만 조작 할 수 있습니다. C99 표준 7.15. – PJTraill

답변

6

당신은 말을해야하지만 명시 적으로해야합니다. 즉, 실제 va_list 객체를 전달합니다.

영감을 얻으려면 vsnprintf() 기능을 참조하십시오. 명시적인 va_list을 사용하는 함수는 종종 표준 라이브러리에 v이라는 접두사가 붙습니다.

va_list에는 작업 할 수있는 내부 구조가 없으므로 불투명합니다. 할 수있는 일은 <stdarg.h> 헤더에 정의되어 있습니다.

+0

나는 더 명백해야했는데, 나는 기본적으로 진짜 va_list를 조롱하고 싶다. – Johannes

+0

이 외에도 불가능합니다. 인수를 C가있는 다른 변수 함수에 전달할 수 없습니다. –

+0

가짜 변수를 만들어 올바른 형식으로 변환 할 수 있습니까? 예 : 배열이나 구조체를 통해? – Johannes