[C++] 가변인자함수

Programming/C++_C#|2017. 2. 14. 15:17
반응형

전에 학원을 다닐 때 팀프로젝트를 했는데

그 때 팀장을 맡으신 분이 이 함수 만들었으니 써~ 라고 했었다.

함수에 인자값의 갯수가 정해져 있는게 아니고 갯수 상관없이 맘대로 넣으면 기능에 따라 작동됐는데

엄청 편했고 신세계였다.

지금 생각해보니 가변인자함수라는 걸 알게 됐고 그것에 대해 적으려고 한다.



가변인자함수


가변이란?

사물의 모양이나 성질이 바뀌거나 달라질 수 있음. 또는 사물의 모양이나 성질을 바꾸거나 달라지게 할 수 있음.

라고 한다.....


먼저 가변인자함수를 쓰기 위해서는 va_list라는 char*자료형을 쓴다.

사실 char형이든 int형이든 구조체든 몇 바이트인지는 상관이 없음~

전부 1바이트로 표현이 되기 때문이당~

10바이트짜리 구조체도 1바이트로 풀어 쓸 수 있다.

예를 들어 서버와 클라간에 IO(입출력)를 할 경우 보낼 정보나 받는 정보를 char형이나 바이트형(1바이트)으로 풀어서 보낸다.




여튼 이 이야기를 하는 것이 아니고 va_list화 시킨다는 것은 1바이트포인터형으로 바꾼다는 것을 이야기한다.

아래 코드를 보자.



코드예

먼저 va_list변수를 하나 선언해준다. 

va_start함수의 첫번째에 위에 선언한 변수를 넣어주면 가변인자의 첫주소( _Count )가 연결된다.

기능은 알아서 구현하면 되고~ 

여기서는 va_arg함수를 통해

int만큼 이동하면서 va_list변수에서 값을 가져옴.

va_end~ 끝~


정리하면

va_list : 가변인자값의 주소를 넣을 포인터변수.

va_start : 가변인자의 첫 주소를 가져와 포인터변수에 넣어주는 함수.

va_arg : 가변인자의 주소가 있는 포인터변수에서 두 번째 인자값의 크기만큼 이동시킨 위치의 값.

va_end : 종료 함수





위에서는 연습용으로 썼지만 아래 코드는 문자열을 붙이거나 연산할 때 유용하게 쓰일 수 있다.



1. 먼저 가변인자함수를 하나 만들어주고 

2. va_start를 통해 주소값을 가져온다.

3. 그리고 복사당할 pzsTemp에 가변인자 문자열 길이만큼 동적할당을 해주고

4. vspintf함수를 통해 pSzName에 있는 문자열에 뒤에 있는(arglist)바이트들 복사해서 만든걸

5. 최종적으로 pszTemp에 복사.




이런식으로 뒤에 가변적으로 추가해도 되는 함수를 가변인자함수라고한다.

val을 안 써도 char*형이나 Byte*로도 구현할 수 있으니 하면 공부도 되고 좋을거 같다.


반응형

'Programming > C++_C#' 카테고리의 다른 글

[C++] 오버로딩함수  (0) 2017.02.23
fopen, fclose, fseek함수  (0) 2017.02.23
[API] 윈도우 api 아이콘 바꾸기  (0) 2016.11.15
memset함수 주의할 점  (0) 2016.10.26
자료형변환시 주의할 점 및 자료형 범위  (0) 2016.10.14

댓글()