가변 인자/가변 인수(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 

 

C 언어 코딩 도장: 66.2 자료형이 다른 가변 인자 함수 만들기

앞에서는 가변 인자의 자료형이 모두 int형이었습니다. 그럼 각각 자료형이 다른 가변 인자는 어떻게 처리할까요? 이때는 switch와 가변 인자를 함께 사용하면 됩니다. 먼저 가변 인자를 처리할 때

dojang.io

https://dojang.io/mod/page/view.php?id=328 

 

 

C 언어 코딩 도장: 39.1 문자와 문자열 포인터 알아보기

문자열은 char 포인터 형식으로 사용합니다. char *변수이름 = "문자열"; 다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요. string_pointer.c #include int main() { char c1 = 'a'; // 변수에 문자 'a' 저장

dojang.io

https://dojang.io/mod/page/view.php?id=743 

 

C 언어 코딩 도장: 85.10 10진수를 16진수로 변환하기

sprintf를 사용하지 않고 10진수를 16진수로 된 문자열로 변환하는 방법입니다. 10진수를 16진수로 변환하는 방법은 10진수를 2진수로 변환하는 방법과 큰 틀이 같습니다. 16으로 나누었을 때 나머지

dojang.io

 

'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

+ Recent posts