C에서 함수에 대해 변수 arity를 구현하는 방법을 아는 사람이 있습니까?C의 변수 아티?
예를 들어, 합계 함수 :
합계 (1,2,3,4 ...); (변수 수를 취함)
고마워!
C에서 함수에 대해 변수 arity를 구현하는 방법을 아는 사람이 있습니까?C의 변수 아티?
예를 들어, 합계 함수 :
합계 (1,2,3,4 ...); (변수 수를 취함)
고마워!
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를 알면된다.
va_arg
and friends을 살펴보십시오.
가변 arity 함수를 구현하려는 경우 http://www.cprogramming.com/tutorial/lesson17.html을 참조하십시오.
모든 추가 인수가 동일한 유형 인 경우 가변 매크로를 사용하는 대신 배열을 전달할 수도 있습니다.
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 이것은 가장 좋은 접근법이다. 나는 자주 사용한다. 그러나 빈 인수 목록을 제공하면 실패합니다. 이를 해결하기 위해 인수의 수를 계산할 때 다음 구문을 사용하십시오. "sizeof ((int []) {0, ## __ VA_ARGS __})/sizeof (int) -1". 빈 목록의 경우 ## __ VA_ARGS__는 선행 쉼표를 사용합니다. – qrdl
당신은 이것에 대해 자세히 설명 할 수 있습니까? 나에게 추상적 인 것 같다 :) – nubela
@nubela : http://stackoverflow.com/questions/1385695/help-me-understand-this-short-chunk-of-code/1386555#1386555 – Christoph
가변 인수에 대응을? 기능? –
원하는대로 구체적으로 작성하십시오. 샘플 코드 (컴파일 할 필요가없고, 성취하고자하는 것을 보여주고, 이상적으로 보이게하는 방법)은 매우 유용 할 것입니다. –
패리티, 아마도? 어떤 맥락에서? 더 말해. – dmckee