2009-09-03 5 views
2

C에서 함수에 대해 변수 arity를 ​​구현하는 방법을 아는 사람이 있습니까?C의 변수 아티?

예를 들어, 합계 함수 :

합계 (1,2,3,4 ...); (변수 수를 취함)

고마워!

+1

가변 인수에 대응을? 기능? –

+0

원하는대로 구체적으로 작성하십시오. 샘플 코드 (컴파일 할 필요가없고, 성취하고자하는 것을 보여주고, 이상적으로 보이게하는 방법)은 매우 유용 할 것입니다. –

+0

패리티, 아마도? 어떤 맥락에서? 더 말해. – dmckee

답변

14

int의 가변 매개 변수 목록입니다. 필요에 따라 유형을 조정하십시오.

#include <stdarg.h> 

void myfunc(int firstarg, ...) 
{ 
    va_list v; 
    int i = firstarg; 

    va_start(v, firstarg); 
    while(i != -1) 
    { 
     // do things 
     i = va_arg(v, int); 
    } 

    va_end(v); 
} 

변수 args를 읽는 것을 언제 중단해야하는지 결정할 수 있어야합니다. 이것은 종결 자 인자 (나의 예제에서는 -1)를 사용하거나 다른 소스 (예를 들어, printf에서와 같이 포맷팅 문자열을 검사함으로써)에서 예상되는 수의 args를 알면된다.

6

모든 추가 인수가 동일한 유형 인 경우 가변 매크로를 사용하는 대신 배열을 전달할 수도 있습니다.

C99 복합 리터럴 및 일부 매크로 마법

이 아주 좋은 볼 수 있습니다 : 무엇

#include <stdio.h> 

#define sum(...) \ 
    sum_(sizeof ((int []){ __VA_ARGS__ })/sizeof (int), (int []){ __VA_ARGS__ }) 

int sum_(size_t count, int values[]) 
{ 
    int s = 0; 
    while(count--) s += values[count]; 
    return s; 
} 

int main(void) 
{ 
    printf("%i", sum(1, 2, 3)); 
} 
+1

+1 이것은 가장 좋은 접근법이다. 나는 자주 사용한다. 그러나 빈 인수 목록을 제공하면 실패합니다. 이를 해결하기 위해 인수의 수를 계산할 때 다음 구문을 사용하십시오. "sizeof ((int []) {0, ## __ VA_ARGS __})/sizeof (int) -1". 빈 목록의 경우 ## __ VA_ARGS__는 선행 쉼표를 사용합니다. – qrdl

+0

당신은 이것에 대해 자세히 설명 할 수 있습니까? 나에게 추상적 인 것 같다 :) – nubela

+0

@nubela : http://stackoverflow.com/questions/1385695/help-me-understand-this-short-chunk-of-code/1386555#1386555 – Christoph

관련 문제