반응형
가변인자에 대해서 알아봅시다.
문제를 해결하려고 할 때
소스를 보면 쉽게 이해를 할 수 있기 때문에
이론 보다는 우리는 소스를 좋아한다.
어느날 타인의 소스를 보다가
다음과 같은 것을 접했다.
이것은 함수 부분인데
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 |