가변 인자란.. 쉽게 생각하면, 인자(파라미터) 값이 변한다는 의미이다..

정확히는 인자의 개수가 변한다는 뜻이다...

같은 함수명이라도,, 파라미터를 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
Posted by 바람처럼..
|