가변 인자/가변 인수(variable argument) 함수
- 인수의 개수가 정해지지 않은 함수. ex)printf
- 첫번째 파라미터에는 가변값이 아닌 고정값오고, 두번째 파라미터부터 … 을 사용하여 가변인수를 받아옴
-> int printf(const char *format, ...)
가변인수함수 관련 매크로/함수는 <stdarg.h>에 정의되어 있고, 다음 명령어로 확인 가능
$ man stdarg
variable argument list(가변 인수 목록)
- void va_start(va_list ap, last);
- type va_arg(va_list ap, type);
- void va_copy(va_list dest, va_list src);
- void va_end(va_list ap);
va_list
-가변 인수를 저장할 구조체로, 각 가변 인자의 시작 주소를 가리킬 포인터
-함수로 전달되는 인수들을 stack 형식으로 저장
void va_start(va_list ap, last);
-va_start(ap, 마지막 고정 인수)
-인수의 목록을 초기화 하는 매크로
-순차적접근을 위해 시작 주소 설정
-va_list의 인스턴스 (ap)와 마지막 고정 인수를 인자로 받는다.
-va_list 를 초기화하는 역할이기 때문에 va_list타입이 선언되어 이전에 인스턴스가 존재해야 한다.
type va_arg(va_list ap, type);
-va_arg(va_list ap, 인수타입)
- 목록에서 인수에 접근하는 매크로
-ap 포인터가 위치한 부분의 데이터를 읽어서 반환 후, ap 포인터 타입길이 만큼 위치가 이동하여 다음 인수를 가리키도록 ap의 값을 갱신
-va_arg 을 호출하여 가변인수에 액세스할 수 있다, 첫번째 호출은 첫 번째 가변인수를 반환, 두번째 호출은 두번째 가변인수를 반환.
- type의 인수로는 char, float는 사용될 수 없다.
#define va_arg(ap, t) (*(t*)((ap+=_INTSIZEOF(-t)-_INTSIZEOF(T)))
void va_end(va_list ap);
- va_list 타입을 NULL으로 초기화
void va_copy(va_list dest, va_list src);
이 매크로는 src에 저장된 가변 파라메터를 dest로 복사한다.
https://dojang.io/mod/page/view.php?id=578
https://dojang.io/mod/page/view.php?id=328
https://dojang.io/mod/page/view.php?id=743
'1 > C' 카테고리의 다른 글
[C] 구조체 struct 정리 (0) | 2022.01.18 |
---|---|
strdup substr memmove strlcpy strlcat (0) | 2021.07.03 |
parameter / argument (0) | 2021.06.19 |
size_t / ssize_t (0) | 2021.06.10 |
파일 입출력 관련 함수 | open() close() read() lseek() (0) | 2021.06.07 |