2013-03-04 2 views
3

모두va_list에 전달 된 인수의 수

va_list에서 the number of passed parameters을 제어하려고합니다.

va_list args; 
va_start(args, fmts); 
     vfprintf(stdout, fmts, args); 
va_end(args); 

단지 va_start 후 매개 변수의 수를 얻을 가능성이 있습니까?

+1

이 아니, 거기 아니다 PARAMS 계산이 매크로를 사용할 수 있습니다. –

+1

아니, 내가 아는 한. 첫 번째 인수로 번호를 전달하기 만하면됩니다. – nhahtdh

+2

직접 계산해야합니다. 또는 [this] (http://stackoverflow.com/questions/4421681/how-to-count-the-number-of-arguments-passed-to-function-that-accepts-a-variabl)을 확인하십시오. – Gandras

답변

2

당신이 원하지 정확하게,하지만 당신은

#include <stdio.h> 
#include <stdarg.h> 

#define NARGS_SEQ(_1,_2,_3,_4,_5,_6,_7,_8,N,...) N 
#define NARGS(...) NARGS_SEQ(__VA_ARGS__, 8, 7, 6, 5, 4, 3, 2, 1) 

#define fn(...) fnexec(NARGS(__VA_ARGS__) - 1, __VA_ARGS__) 

static void fnexec(int n, const char *fmt, ...) 
{ 
    va_list args; 

    va_start(args, fmt); 
    printf("%d params received\n", n); 
    vprintf(fmt, args); 
    va_end(args); 
} 

int main(void) 
{ 
    fn("%s %d %f\n", "Hello", 7, 5.1); 
    return 0; 
} 
1

직접 계산할 수 없습니다. 예 printf 들어

은 다음 인수를 계산하는 첫 번째 파라미터를 사용하여 가변 개수의 함수이다 : 제 printf는 첫 번째 인자 ("%s %i %d")를 파싱

printf("%s %i %d", ...); 

기능 및 3 개 개의 인수가 다음 추정한다.

귀하의 경우, fmts을 구문 분석하고 %- 추출기를 추출한 다음 다른 인수를 추정해야합니다. 사실 각 %[flags][width][.precision][length]specifier은 인수로 간주 될 수 있습니다. read more...

+0

정확히하고 싶은 것은 printf (% s % s)가있는 경우에 printf와 같은 함수를 만드는 것입니다. 두 번째 % s는 어떤 인수와도 일치하지 않기 때문에 하나의 매개 변수 만 문제가됩니다. 우리는 출력 bizzard 캐랙터에서 찾을 것입니다 ... – Aymanadou

+0

당신은 그 실수를 피할 수 없으며,'printf' 자체가 호출자에게 인자를 전달하도록 강요 할 수 없습니다 지정자와 동일합니다. – deepmax

+0

예를 들어,'printf ("% i % i", 12);를 쓸 수 있습니다. '틀렸지 만 가능하면 – deepmax

관련 문제