본문 바로가기
프로그래밍/C

C ] 가변인자 함수 만들기, 가변인자 출력함수 만들기

by eteo 2022. 8. 12.

printf() 함수의 경우 내가 원하는 만큼 인자를 넘길 수있다. 예를 들면

printf("%d", a);	// 인자 2개
printf("%d %d", a, b);	// 인자 3개

 

이게 가능한 이유는 printf()가 매개변수의 개수가 정해지지 않은 가변인자 함수이기 때문이다.

 

가변인자 함수로 인자의 개수와 상관없이 정수형 인자를 여러개 받아서 인자 모두를 더한 값을 반환하는 함수를 만들어보도록 하겠다.

 

 

 

 

#include<stdio.h>
// stdarg.h 포함. va_list, va_start, va_arg, va_end가 정의된 헤더 파일
#include<stdarg.h>

int sum(int num_args, ...) { // 가변 인자의 개수를 받음, ...로 가변 인자 설정
	
	va_list ap;					// 가변 인자 목록 포인터

	va_start(ap, num_args);		// 가변 인자 목록 포인터 설정

	int arg = 0;
	int sum = 0;
	for (int i = 0; i < num_args; i++) {	// 가변 인자 개수만큼 반복

		arg = va_arg(ap, int);	// int 크기만큼 가변 인자 목록 포인터에서 값을 가져옴 동시에 ap를 int 크기만큼 순방향으로 이동
		sum += arg;
	}
	va_end(ap);					// 가변 인자 목록 포인터를 NULL로 초기화

	return sum;
}

int main() {

	// 맨 처음에 인수 개수를 넣어준 뒤 인수 개수에 맞게 인수를 콤마로 구분하여 넣어줌
	printf("%d\n", sum(1, 10));
	printf("%d\n", sum(2, 10, 20));
	printf("%d\n", sum(3, 15, 15, 15));
	printf("%d\n", sum(4, 10, 10, 20, 20));
	printf("%d\n", sum(5, 1, 2, 3, 4, 5));

	return 0;
}

 

 

 

실행 결과

 

 

 

 

 

참고 : https://dojang.io/ 

 

가변인자 출력함수 만들기

 

 

 void printMsg(char *format,...)
 {
#ifdef _DEBUG
	char str[80];

	va_list args;
	va_start(args, format);
	vsprintf(str, format,args);
	HAL_UART_Transmit(&huart3,(uint8_t *)str, strlen(str),HAL_MAX_DELAY);
	va_end(args);
#endif
 }

 

 

1. 가변 인수 목록을 가리킬 va_list 타입의 변수 args를 선언한다.

 

2. va_start로 va_list 변수가 목록 중 첫번째 가변인수를 가르키도록 초기화한다.

두번째 파라미터로 마지막 고정 매개변수를 넘기면 그 다음 번지로 가변인수 목록 시작 위치를 지정하고, 이후 va_arg를 사용하면 두번째 파라미터인 인수 타입에 따라 순서대로 가변인수를 읽을 수 있다.

void va_start(va_list ap, last_fixed_param);

 

3. vsprintf 함수를 사용하여 format에 담긴 정보를 기반으로 가변인수를 처리하여 문자열을 생성하여 str버퍼에 저장한다.

 

4. 저장된 문자열을 출력함수에 전달해 출력한다.

 

5. va_end로 가변인수 리스트를 정리하고 마무리한다.