- 개략적인 구조
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 |