정의
매개 변수의 개수가 변할수 있는 인자이다.
예를 들어, 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 여러가지 형태를 받는다.
이럴때는 가변인자 템플릿을 사용해야한다.
가변인자 템플릿은 다음글에서 설명하겠다.
'게임 프로그래밍 > C++ 기초' 카테고리의 다른 글
C++ 함수 포인터 (0) | 2020.05.05 |
---|---|
C++ 가변 인자 템플릿 (0) | 2020.05.05 |
C++ 가상함수테이블(Virtual function table) (3) | 2020.05.02 |
C++ 자료형의 type을 알아내는 방법 typeid() (0) | 2020.05.02 |
C++ 다형성(Polymorphism) (0) | 2020.05.02 |