본문 바로가기
programing/C++

가변 인수 함수

by RedWiz 2015. 6. 8.

 

- 개략적인 구조

void VarFunc(int Fix, ...)

{

va_list ap;

va_start(ap,Fix);

while (모든 인수를 다 읽을 때까지) {

va_arg(ap,인수타입);

}

va_end(ap);

}

 

- 사용되는 함수들은 매크로 함수로 되어 있음

typedef char *  va_list;

 

#define _crt_va_start(ap,v)  ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )
#define _crt_va_arg(ap,t)    ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define _crt_va_end(ap)      ( ap = (va_list)0 )

 

#define va_start _crt_va_start
#define va_arg _crt_va_arg
#define va_end _crt_va_end

 

- va_list ap

> Argument Pointer

> 스택에 있는 인수를 읽을 때 포인터 연산을 해야 하는데 현재 있는 번지를 기억하기 위한 포인터 변수

 

- va_start(ap, 마지막고정인수)

> 첫 번째 가변 인수를 가리키도록 하는 함수

> 마지막 고정 인수 : 첫 번째 가변 인수의 번지를 조사하기 위해 마지막 고정 인수 전달

 

- va_arg(ap, 인수타입)

> 가변 인수를 실제로 읽는 명령

> ap 번지에 있는 값이 어떤 타입인지 정해야 매크로 함수가 값을 제대로 읽을 수 있으므로 타입 지정

> ap 위치에서 타입에 맞는 값을 읽어 리턴하면서 ap 다음 가변 인수 위치로 옮김

=> 반복 호출하면서 순서대로 가변 인수를 읽을 수 있음

 

- va_end(ap)

> 뒷 정리, 별다른 동작은 하지 않으며 실제로 없어도 지장은 없음

> 필요한 이유는 호환성, 플랫폼에 따라 필요한 경우가 있음

 

* 조건

> 적어도 하나 이상의 고정 인수

> 함수 내부에서 자신에게 전달된 가변 인수의 개수를 알 수 있도록 해야함

( 혹은 가변 인수의 목록 끝에 특이한 값 전달 )

> 함수 내부에서 각각의 가변 인수 타입을 알 수 있어야 함

 

'programing > C++' 카테고리의 다른 글

함수 객체  (0) 2015.06.08
함수 포인터  (0) 2015.06.08
[펌] Modern C++ 프로그래머를 위한 CPP11/14 핵심  (0) 2015.06.03
[펌] Let`s learn ! Effective C++  (0) 2015.06.03
code, data(bss), heap, stack  (0) 2015.05.22