정의

매개 변수의 개수가 변할수 있는 인자이다.
예를 들어, printf, scanf 가 가변인자를 사용한 함수이다.

코드로 가변 인자를 사용하면서 설명하겠습니다.
정수를 더하는 가변 인자 함수입니다.
코드

#include <iostream>

int Y_SUM(int _Count, ...)
{
	int Return_Value = 0;
	va_list va;
	__va_start(&va, _Count);

	for (int i = 0; i < _Count; i++)
	{
		Return_Value += __crt_va_arg(va, int);
	}
	__crt_va_end(va);

	return  Return_Value;
}

int main()
{
	std::cout << Y_SUM(5, 1, 2, 3, 4, 5, 6) << std::endl;
	std::cout << Y_SUM(3, 1, 2) << std::endl;
	std::cout << Y_SUM(5, 2, 4, 6, 8, 10, 12) << std::endl;
	std::cout << Y_SUM(3, 1, 2, 3, 4) << std::endl;
	return 0;
}

결과

설명

가변 인자의 사용 방법을 보자 
현재 int Y_SUM(int _Count, ...)라고 선언을 했다.
가변인자는 ...을 사용해서 받고있습니다.

코드를 보면

va_list : 가변인자를 가르키는 포인터

va_start : va_list를 특정 위치로 이동

va_arg : va_list가 가리키는 위치부터 자료형 크기만큼 데이터를 읽어서 반환

va_end : va_list를 NULL로 변경

이렇게 4가지의 가변인자 함수들이있는데

va_list 는 char* 입니다. 매개 변수의 주소 값을 받는 아이입니다.

va_start(&va, _Count)를 하게되면 va에는 첫번째 가변 인자의 주소를 가리키게 되고

va_arg(va, int)를 하게 되면 int의 크기인 4바이트씩 메모리의 주소를 변경하면서 값을 반환한다.

va_end(va)를 하게 되면 va를 NULL로 바꾼다.

Y_SUM(5, 1, 2, 3, 4, 5, 6) 의 출력이 15인 이유는 5번 반복하기때문이다 1 + 2 + 3 + 4 + 5 = 15
가변인자로 6개의 인자를 넣어줘도 반복문으로 5번만 돈다.
Y_SUM(3, 1, 2) 의 출력이 쓰레기값인 이유는 가변 인자의 범위를 넘어가 쓰레기값을 더해주었기때문이다.
Y_SUM(5, 2, 4, 6, 8, 10, 12) 과 Y_SUM(3, 1, 2, 3, 4)의 출력은 첫번째 경우와 같은 경우이다.

증명 해보자

증명

#include <iostream>

int Y_SUM(int _Count, ...)
{
	int Return_Value = 0;

	int* temp_p;
	va_list va;
	__va_start(&va, _Count);
	temp_p = (int*)va;
	for (int i = 0; i < _Count; i++)
	{
		temp_p = (int*)va;
		Return_Value += __crt_va_arg(va, int);
		temp_p = (int*)va;
	}
	__crt_va_end(va);

	return  Return_Value;
}

int main()
{
	std::cout << Y_SUM(5, 1, 2, 3, 4, 5, 6) << std::endl;
	std::cout << Y_SUM(3, 1, 2) << std::endl;
	std::cout << Y_SUM(5, 2, 4, 6, 8, 10, 12) << std::endl;
	std::cout << Y_SUM(3, 1, 2, 3, 4) << std::endl;
	return 0;
}

int* temp_p를 선언해서 va값을 int*로 형변환해서 받아보았다.

va_start() 함수 실행 후 
va는 가변 인자중 첫번째인 5를 가리키고있다.

va_arg() 함수 실행 후
va는 다음 인자인 1을 가리키고 있다.

쭉 진행한 후

va_end() 함수 실행 후
va는 NULL이 되었다.

그러면 printf()같은경우 int형만 받는게아니라 char short int double string 여러가지 형태를 받는다.

이럴때는 가변인자 템플릿을 사용해야한다.

가변인자 템플릿은 다음글에서 설명하겠다.

+ Recent posts