시작하기에 앞서서 가변인자에 대해 알아야 합니다.
가변인자란?
인수의 개수와 타입이 미리 정해져 있지 않다는 뜻입니다.
그렇다면 시작과 끝에 대한 정보가 필요할 것입니다. 이 정보를 고정 인수를 통하여 알아낼 수 있어야 합니다.
따라서 반드시 하나 이상의 고정 인수를 가져야 합니다.
지금부터 고정 인수의 역할에 대해 알아보도록 하겠습니다.
고정 인수의 역할
- 고정 인수 다음부터 가변 인수가 시작이 되기 때문에 가변 인수의 시작점을 알아차리게 해 줍니다.
- 가변 인수들이 어떤 자료형으로 들어와 있는지도 알아내야 합니다.
- 가변 인수의 개수를 알아낼 수 있는 정보가 있어야 합니다.
지금까지 배운 내용을 통하여 예시를 들어보도록 하겠습니다.
#include <stdio.h>
#include <stdarg.h>
void test(int count, ...)
{
int i;
int n;
va_list ap;
if (count <= 0)
return ;
printf("%d개의 수를 출력합니다. \n", count);
i = 0;
va_start(ap, count);
while (++i <= count)
{
n = va_arg(ap, int);
printf("%d번째 수 : %d\n", i, n);
}
va_end(ap);
}
int main(void)
{
test(3, 1, 2, 3);
return (0);
}
오!! 위에서 다루지 않은 내용이 많이 포함이 되어 있는 것 같습니다.
우선 위에서 배운 내용부터 차근차근 정리해 보면서 해보도록 하겠습니다.
void test(int count, ...)
제가 고정 인수는 무조건 하나 이상 있어야 한다고 설명을 드렸습니다.
고정 인수에 꼭 필요한 정보에 대해서도 말씀을 드렸죠.
위에 있는 고정 인수의 역할에 하나하나 매칭해 보면서 살펴보도록 하겠습니다.
- 가변 인수의 시작점은 count뒤에서부터 시작이 되게 됩니다.
- 가변 인수의 자료형(type)은 고정 인수인 count와 같은 자료형을 사용합니다.
- 가변 인수의 개수는 count의 수입니다.
가변 인수의 위치를 담을 메모리 주소가 필요합니다.
va_list ap;
가변 인수의 위치를 나타나게 될 포인터 주소입니다.
현재는 아직 쓰레기 위치에 있습니다. 이를 저희가 원하는 위치로 바꾸어 주어야 합니다.
가변 인수의 시작점은 count뒤에서부터 시작되게 됩니다.
va_start(ap, count);
이제 ap의 시작점을 count뒤로 초기화를 해주는 부분입니다.
가변 인수의 자료형(type)은 고정 인수인 count와 같은 자료형을 사용합니다.
n = va_arg(ap, int);
va_arg(ap, int)는 ap의 위치를 int자료형 만큼 넘겨준다는 뜻입니다.
위의 예에서는 가변 인수 모두 int자료형만을 사용하기 때문에 가변 인수 하나를 읽을 때마다 int자료형 만큼을 넘기게 됩니다.
끝까지 다 읽었을 경우에 ap를 초기화시켜 주어야 합니다.
ap에는 저희가 읽었던 값들이 써져 있습니다. 이를 NULL로 바꾸어 주는 부분입니다.
va_end(ap);
사실 위의 명령어는 넣어주어도 그만 넣어주지 않더라도 코드에는 큰 문제가 발생하지 않습니다.
그럼에도 위의 명령어를 사용하는 이유는 플랫폼에 따라서는 가변 인수를 읽은 후에 뒤처리를 해야 하는 경오도 있기 때문입니다. (즉, '호환성 때문에 관례적으로 넣어 주는 것이 좋다.'라고 이해하셔도 좋을 것 같습니다. )
이렇게 오늘은 가변 인자를 사용하는 방법에 대해 간략하게 알아보았습니다. 하시는 프로젝트 혹은 과제에 많은 도움이 되셨으면 좋겠습니다.
'Language > C언어' 카테고리의 다른 글
C045_perror함수 사용하기 (0) | 2024.01.03 |
---|---|
C044_malloc 사용하기 (0) | 2024.01.02 |
C042_Makefile 만들기 (2) | 2023.12.29 |
C041_read함수 사용하기 (0) | 2023.12.28 |
C040_strlen 함수 구현해서 사용하기 (0) | 2023.12.08 |