C 언어 - 가변인자 (가변매개변수) - variable argument

컴퓨터/C

728x90
반응형

함수의 가변 인자 

C언어에서 함수를 사용하는 법에 대해서 어느 정도 익숙해지셨을 것이라 생각됩니다. 다양한 함수들을 보다 보면 함수의 원형에...으로 표현된 것을 보셨을 것입니다. 이런 형태의 표현을 가변 인자 , 가변 매개변수라고 합니다.

대표적으로 printf함수의 원형을 한번 살펴 보도록 하겠습니다.

 

int printf(const char *format,...);

함수의 원형은 위와 같은 형태로 되어있으며 우리가 printf함수를 호출하여 사용할 때에도 인자의 수가 정해지지 않습니다. 이렇게 인자의 개수가 정해지지 않았을 때 사용하는 것이 바로 가변 인자(Variable argument)라고 부릅니다.

 

가변 인자를 사용한 함수의 선언 하기

함수에서 가변 인자를 선언하기 위해서는... 을 이용합니다.

void func(int numargs , ...) // ...이 가변인자라는 표현
{
	소스코드
}
int mina()
{
	func(1,10); // numargs = 1 , 가변 인자 1개 10
    func(2,10,20); // numargs = 2 , 가변 인자 2개 10 , 20
	return 0;
}

위의 소스코드처럼 가변인자라는 표현은... 을 통해 정의 내릴 수 있습니다. 

또한 함수의 호출을 할 때에 고정된 인자들을 넣은 후에 원하는 개수만큼 가변 인자를 넣을 수 있게 됩니다.

 

가변 인자를 사용하기

함수에 가변인자를가변 인자를 정의하여 그 가변 인자를 사용하기 위해서는 C언어에서 제공하는 가변 인자를 제어하기 위한 라이브러리를 추가해 주어야 합니다. 주요 내용은 아래와 같습니다.

  • <stdarg.h> 가변인자들을 제어하기 위한 라이브러리 헤더 파일
    • va_list : 가변 인자 목록으로 가변 인자의 메모리 주소를 저장하는 포인터
    • va_start : 가변 인자를 가져올 수 있도록 설정
    • va_arg : 가변 인자 포인터에서 특정 자료형의 크기만큼 값을 꺼냄
    • va_end : 가변 인자 처리가 끝났을 때 포인터를 NULL로 초기화해준다.

사실 위의 내용보다 실습 코드를 이용해 직접 제어를 해보는 것이 더 효율적일 것입니다.

#include <stdio.h>
#include <stdarg.h>
void func(int numargs, ...)
{
	//가변 인자들을 담을 목록 포인터 만들기
	va_list numlist;
	//가변 인자 목록 포인터에 들어온 가변인자 셋팅하기
	va_start(numlist, numargs);
	//가변 인자의 수만큼 반복하면서 가변인자 탐색해보기
	for (int i = 0; i < numargs; i++)
	{
		// 가변 인자를 담은 목록 포인터에서 int크기만큼 값을 꺼내서 확인 
		printf("%d 번째 가변인자 : %d \n", i + 1, (va_arg(numlist, int)));
	}
	//사용이 끝난 가변인자 목록 포인터의 소멸
	va_end(numlist);
}
int main()
{
	printf("함수 실행 1 \n");
	func(3, 20, 30, 40);
	printf("함수 실행 2 \n");
	func(5, 1, 2, 3, 4, 5);
	return 0;
}

 

가변 인자를 사용할 때 주의사항

  • 가변 인수를 사용하기 위해서는 가변 인수의 갯수를 알수 있어야 하기 때문에 반드시 하나 이상의 고정 인자가 필요하다.
    • 가변인수의 크기를 알아야만 함수에서 정확한 제어가 가능하기 때문
    • 고정 인자를 통해 함수 내에서 크기를 유추하게 구현 또한 가능하다.
      • printf 같은 경우 서식 지정자의 개수를 카운팅해 구현
  • 가변 인수는 항상 함수의 가장 뒤에 호출이 돼야 된다.
    • 당연히 고정 인자와 가변 인자를 구분하기 위해서는 가변 인자는 뒤에 있어야 된다. 
      • 만약 앞쪽에 위치하고 있다면  가변 인자의 끝을 알 수 없다.
  • 가변 인수의 자료형을 명확하게 알아야 한다. 
    • va_arg를 통해 가변 인자를 담은 목록에서 자료형의 크기만큼 빼내어 데이터를  처리하기 대문에 데이터의 타입을 유추할 수 있어야만 정확한 가변 인자들의 값을 확인할 수  있다.

 

728x90
반응형

Commnet

G91개발일지

Gon91(지구일)

91년생 공학엔지니어의 개발일지

TODAY :

YESTER DAY :

TOTAL :