가변 인자란.. 쉽게 생각하면, 인자(파라미터) 값이 변한다는 의미이다..
정확히는 인자의 개수가 변한다는 뜻이다...
같은 함수명이라도,, 파라미터를 2개, 3개,.. 이렇게 쓸 수 있다는 것이다.
그렇다면 함수 오버로딩이 아닌가 생각할 수도 있다..
하지만 그 것과는 엄연히 다르다..
흔히 우리가 쓰는 printf()를 떠올리면 이해하기가 쉽다...
printf("%d %s ", int , char ) ;
라고 보면 똑같이 printf() 이지만.. 뒤의 파라미터들이.. 2개일 수도.. 3개일수도
아니면 더 클 수도 있다...
이럴때 쓰는 것이 가변인자이다...
가변 인자를 사용 하려면.. 일단.. 함수의 원형을 정의하면된다..
가변 인자를 이용해서.. 입력된 숫자들의 총합을 구하는 함수를 만들어 보자..
int add ( int, ... ) ;
이렇게 선언을 한다... 앞의 int만 유일하게 고정 인자고,.. 뒤의 ... 으로 뒤에는
몇개의 숫자가 오든 상관없다 ( 앞의 int를 count로 쓸 것이니 함수를 사용할 때는.. 신경을 써야한다..)
그리고 가변 인자를 쓰기 위해서는 헤더파일..
#include <stdarg.h>
를 추가한다...
그리고 가변 인자를 위한 3개의 매크로가 있다..
va_start(va_list list) ;
va_arg(va_list list, type) ;
va_end(va_list list );
이다...
va_start는 list를 초기화 한다.. 그 의미는 포인터를 list의 맨 처음을
가리키도록 하는 것이다...
이 함수를 쓰지 않으면, va_arg를 통해서 모든 인자를 다 쓰면, 처음으로 되돌
릴 수 없게된다...
va_arg는 고정 인자를 제외한 나머지 인자들을 얻기 위해 사용되며, 보통은
for()문을 이용해서 처리한다...
type위치에는 int, char 같이 가변 인자의 자료형을 넣어준다...
va_end는 가변 인자의 사용을 끝낼 때 사용하지만, 보통은 사용 안해도 무방하다..
그럼 동작이 가능한 함수를 만들어 보자...
위의 사진의 int add(int count, ...) 함수의 내부를 보면..
va_* 매크로를 이용하여서 리스트를 초기화, 값을 받고, 종료 시킨다..
그리고 실행시킨 결과 값이다....
어떤가.. 가변 인자를 잘쓰면, 좀 더 깔끔한 코드를 작성할 수 있지 않을까?
하지만, 가장 큰 주의사항들을 정리하면..
꼭, 1개 이상의 고정 인자가 있어야 한다는 점이다.....
위 사진 처럼.. int add(int count, ...) 의 int count가 고정 인자 이다..
이 것을 없얘고 int add(...) 이렇게 쓰면 에러를 일으킨다..
printf()에서 첫 인자가 꼭 "%d", "%d %s" 인 이유가 바로 여기있다..
위처럼 %* 가 있어야.. 뒤에 가변 인자가 몇개인지.. 알 수 있기
때문이다...
'프로그래밍 > C,C++' 카테고리의 다른 글
[C,C++] 이름공간(namespace) (0) | 2011.09.14 |
---|---|
[C,C++] 인-라인(in-line) 함수 (0) | 2011.09.14 |
[C,C++] getchar() 의 문제점.. (2) | 2011.08.28 |
[C,C++] scanf 와 fgets (0) | 2011.08.27 |
[C,C++] sprintf 사용하기... (2) | 2011.08.23 |