재우이 2018. 1. 3. 20:35

1. 가변 인자 함수

- 함수에 들어가는 인자의 개수가 변하는 것

- 함수를 호출 할때 인수의 개수나 타입의 변경을 할 수 있다.


2. 자료형 함수이름 (자료형, 고정매개변수, ...)

- 가변 인자를 정의할 때는 고정 매개변수가 한 개 이상 필요

- "..." 생략 표시를 통하여 가변인자 표시


bool WriteLog(LPTSTR data, ...)

{


}



3. va_list, va_start(), va_arg(), va_end()


va_list 

- char* 로 정의 되어 있으며 이 포인터가 각 인자의 시작주소를 가르킨다.


va_start() 

- va_list로 만들어진 포인터에게 가변인자의 첫 번째 주소를 가르켜주는 매크로

- va_start(ap, v);  ap : va_list로 만든 포인터, v : 마지막 고정인수 


va_arg()

- va_list의 포인터를 다음가변인자로 이동시켜주는 매크로

- va_arg(ap, t);  ap : va_list로 만든 포인터, t : 타입 형태 (char, int, long ...)


va_end() 

- 가변인자를 NULL 포인터로 만드는 매크로, 가변인자 종료역할 

- va_end(ap);  ap : va_list로 만든 포인터


4. 가변인자함수 출력 함수 vsprintf()

vsprintf() : Dest 변수에 형식에 따라 만들어진 문자열 저장 

int vsprintf (char* Dest, const char* Format, va_list Args)

- Dest : Format에 따라 만들어진 내용이 담길 버퍼

- Format : 고정인수

- Args :  va_list로 만든 포인터, 가변 파라미터

- 리턴 값 : 문자열의 길이


5. 예제


#include <stdio.h>

#include <stdarg.h>

#include <string.h>


void VariableFun(int arg, ...)

{



//가변인자 목록 포인터

va_list ap;

//가변인자 목록 포인터에 가변인자 첫 번째 주소 가르킴

va_start(ap, arg);

//가변인자 만큼 반복

for (int i = 0; i < arg; i++)

{

//int 크기만큼 포인터를 이동

int result = va_arg(ap, int);

printf("%d ", result);

}

//가변인자 목록 포인터에 NULL 초기화

va_end(ap);


printf("\n");

}



int main()

{

VariableFun(1, 2);

VariableFun(2, 2, 0);

VariableFun(3, 2, 0, 8);

VariableFun(4, 2, 0, 8, 0);

VariableFun(5, 2, 0, 8, 0, 2);

}


결과