728x90
가변 인자 함수
- 가변 인자란?
- #include <stdarg.h>에 va_list, va_start, va_arg, va_end가 정의된 헤더 파일
- 매번 함수에 들어가는 인수(argument)의 개수가 변하는 것을 가변 인자(가변 인수, variable argument)라고 한다.
- 가변 인자를 정의할 때는 고정 매개변수가 한 개 이상 있어야 하며 고정 매개변수 뒤에
...
을 붙여 매개변수의 개수가 정해지지 않았다는 표시를 해준다.
void printNumbers(int args, ...) // args는 고정 매개변수, ...로 가변 인자 설정
{
printf("%d ", args);
}
int main()
{
printNumbers(1, 10); //1
printNumbers(2, 10, 20); //2
printNumbers(3, 10, 20, 30); //3
printNumbers(4, 10, 20, 30, 40); //4
return 0;
}
man 3 stdarg
- va_list : 가변 인자 목록으로, 가변 인자의 메모리 주소를 저장하는 포인터
- 가변 인수들에 대한 정보를 홀드하기 위한 타입
- 각 가변 인자의 시작 주소를 가리킬 포인터
va_start: 가변 인자를 가져올 수 있도록 포인터를 설정
void va_start(va_list ap, last);
- ap는 void 포인터 변수(va_list)이며, 함수가 호출되기 전에 선언되어야 한다.
- 두번째 인수인 last는 고정인수로, 가변 인수의 시작번지를 찾기 위한 중요한 역할을 한다. last 다음 주소가 가변인수의 시작번지가 된다.
va_arg : 가변 인자 포인터에서 특정 자료형 크기만큼 값을 가져옴
type va_arg(va_list ap, type);
- 가변인수를 읽는 함수, 첫 번째 인수 ap는 va_start가 사용한 ap와 동일한 변수며, ap가 가리키는 번지의 데이터를 가변 인수로 읽는다.
- 두 번째 인수 type은 가변 인수의 데이터형을 나타낸다. 데이터 형에 따라 데이터를 읽어 리턴
- type 인수로 char, float는 사용 X
va_end : 가변 인자 처리가 끝났을 때 포인터를
NULL
로 초기화void va_end(va_list ap);
- 가변 인수를 다 읽은 후, 함수가 정상적으로 리턴되도록 도움
- va_end가 호출되면, ap가 변경되므로 va_start를 호출하지 않고는 가변 인수를 다시 읽을 수 없도록 한다.
va_copy :
void va_copy(va_list dest, va_list src);
참조 : https://dojang.io/mod/page/view.php?id=577
https://wonillism.tistory.com/169
728x90
'공부 > C\C++' 카테고리의 다른 글
[C/C++] write와 printf의 혼용으로 인한 문제 (printf 출력 순서 이상) (0) | 2021.03.31 |
---|---|
[C/C++] char *와 char []의 차이와 bus error (0) | 2021.03.31 |
[C/C++] int와 long, unsigned int와 unsigned long의 차이와 혼동으로 인한 문제점 (0) | 2021.03.18 |
[C/C++] 구조체와 연결리스트 (0) | 2021.03.16 |
[C/C++] cin과 scanf의 차이 (0) | 2021.03.06 |