C - 가변 인자 함수
업데이트:
가변 인자 함수
정해지지 않은 수의 매개변수(가변인자)를 허용하는 함수
- 반드시 최소 한 개의 정해진 자료형의 매개변수가 필요함
언제 사용할까
- 메모리에 블록을 크게 잡아 두고 거기에 여러 가지 자료형을 저장하는 함수
printf(), scanf()
#include <stdarg.h>
int add_ints(const size_t count, ...) {
va_list ap;
int sum;
size_t i;
sum = 0;
va_start(ap, count);
{
for(i=0; i<count; i++){
sum += va_arg(ap, int)
}
}
va_end(ap);
return sum;
}
va_list
- 가변 인자 목록
va_start(), va_arg(), va_end()
매크로 함수를 사용할 때 필요한 정보가 포함- 명시되지 않은 자료형
va_start()
va_start(<가변인자목록>, <가변인자 시작하기 직전 매개변수>)
- 매크로 함수
- 가변 인자에 접근하기 전 반드시 호출해야 함
va_list
에 필요한 초기화를 수행- 가변 인자가 스택 메모리의 어디서부터 시작하는지 찾아냄
- 그래서 가변인자 시작 직전 매개변수가 필요
va_start(ap, count);
// 전처리기가 아래로 대체한다
ap.data = (char*)&count + sizeof(count); // 가변인자 시작 직전 매개변수로 첫 번째 가변인자 주소를 찾음
va_end()
- 매크로 함수
- 가변 인자들의 접근이 끝난 뒤 반드시 호출해야 함
- 가변 인자 목록을 정리함
- 더 이상 가변 인자를 사용할수 없도록 값을 수정함
va_arg()
va_arg(<가변인자목록>, <얻어올 가변 인자의 자료형>)
- 매크로 함수
- 다음 가변 인자를 가져옴
- 표준상의 문제로 가변 인자 목록의 기본 자료형 인자들은 다음과 같이 승격(promotion) 됨
- 모든 정수형은
int
- 모든 부동소수점은
double
- 따라서 두 번째 매개변수에는
int
나double
을 써야 함 (char
사용 시 문제 있을수도)
- 모든 정수형은
매크로 함수
- 함수처럼 보이나 함수가 아님
- 스택 프레임 생성 X
- 매개변수 전달 X
- 함수 주소로 점프 X
- 전처리기가 매크로 함수의 구현 코드로 대체시켜 줌
val = va_arg(ap, int);
// 아래로 대체한다
val = *(int*)ap.data;
((int*)ap.data)++;
첫 번째 매개변수로 가변인자 못 쓰는 이유
- 가변인자가 몇 개인지 함수는 모름 단, 스택 메모리의 어느 위치부터 가변 인자가 시작되는지 앎
- 가변 인자의 자료형을 가변 인자 함수는 모름
- 자료형은 실행중에 결정됨.
- 그래서 스택의 어떤 위치를 어떤 형으로 읽어야할 지 모름
- 따라서 정해진 자료형으로 넘겨주는 매개 변수로부터 알아내야 함
댓글남기기