가변인자 함수
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);
}
결과