본문 바로가기
[Public] 프로그래밍/C

[C] 가변 인자

by 차출발 2010. 4. 30.
반응형

가변인자에 대해서 알아봅시다.



문제를 해결하려고 할 때 

소스를 보면 쉽게 이해를 할 수 있기 때문에 

이론 보다는 우리는 소스를 좋아한다.




어느날 타인의 소스를 보다가

다음과 같은 것을 접했다.

이것은 함수 부분인데

void Sum(int a, ...)




잉 ㅡ,.ㅡ

" ... " 점,점,점 이거 멍미

이거 컴파일 오류 아닌가 ? 하는 생각이 들수 도 있다.

하지만 이것은 정규문법





... 너는 누구니?

내 이름은 " 가변인자  "

나는 인자의 개수를 임의로 설정할 수 가 있지 


몸 색이 변화하는 온 을 물리칠 수 있지 !



재미 없었으면 죄송 ㅋ





가만 ...

너 어디서 많이 봤는데

그렇다 printf, scanf 등등 안에 들어간다.

그럼 printf 내부 구조는 가변인자로 되어 있구나


그럼 수는 어떻게 구별하지? 

 % 너 이놈이구나 .. 하악하악 들켯군 ㅋㅋㅋ

그럼 어떻게 사용하는지를 보자






첫번째

  먼저 헤더파일 선언  

#include <stdarg.h>

이건 누구나 할 수 있는것이니  패스.....

못한다면 문제 있다. ㅡ,.ㅡ;





두번째

인자를 위한 매크로를 알아야한다

void va_start(va_list list, last);    // 시작 할때 사용 

type va_arg(va_list list, type);    // 인자를 얻어 올때 사용

void va_end(va_list list);           // 끝날 때 사용

이정도만 알고 가면 될 듯 싶다.

사용할려면 위 함수를 외워 둬라 



세번째

여기서 va_list 는  다음과 같이 정의 되어 있다.

typedef void *va_list

이잉... 저것은 void 형 포인터

그렇다 

다양한 타입을 사용가능케 한다.




네번째

유의할 사항으로 

va_start()를 사용할때 조심하자

적어도 하나 이상의 고정 인자 를 가질 것

한 마디로 

int Sum(...) 

요런건 안되는 거 알쥐





위 4가지 사항을 한번에 소스로 적용하여 

오랫동안 기억에 남겨 보자.


---------------------------------------------소스---------------------------------------------------
#include <stdio.h>
#include <stdarg.h>

int Sum(int n, ...);
void main()
{
int nSum = Sum(5, 1, 2, 3, 4, 5, 6, 7, 8);
printf("%d\n", nSum);
}

int Sum(int n, ...)
{
int nSum=0;
va_list list;
va_start(list, n);
for(int i=0 ; i<n ; i++)
nSum += va_arg(list, int);
va_end(list);
return nSum;
}
----------------------------------------------------------------------------------------------------

위의 출력 값은 무엇 일가?
.
.
.

15 라 답하지 못한 당신은 "루저"

첫번째 항은 5 이다.

즉 가변인자 시작이 5개

그래서 for 문에서 5개만 사용하니

1 + 2 + 3 + 4 + 5

고로 답은 15이다.




가변인자에 대해 설명을 다했다.

시간이 된다면 

가변인자를 이용하여

직접 자신의  printf()를 만들어 보아라

그럼 가변인자는 잊어버리지 않고 

평생 기억 할 수있을 것이다.







<글을 읽으시고 도움이 되셨다면 리플 부탁드려요 ^^>





'[Public] 프로그래밍 > C' 카테고리의 다른 글

[C] 구조체 비트필드  (6) 2011.07.28
ESP 와 EBP  (0) 2010.01.25
[C] getch 함수에서 화살표나 F1 키등등 표현  (0) 2009.10.12