가변함수, 가변인자(variable argument)

jiwoo·2022년 2월 18일
0

가변인자 다루기 variable argument

<stdarg.h>

  • 가변인수를 받는 함수 만들기
    int ft_printf(const char *c, ...);
    int sum(int count, ...);
    파라미터의 ', ...'부분이 가변인자를 받는다.
    .
  • va_list
    가변인자의 포인터를 저장하는 구조체
    va_list ap; (argument pointer)
    • ap를 선언하고 다른 함수로 ap를 넘겨줄때
      void test(va_list *ap); 파라미터를 포인터로 설정하고
      test(&ap); 주소로 넘겨주기
      그냥 va_list ap 로 주고 받아놓고 오류 찾느라 헤맸다.
      .
  • void va_start(va_list ap, last);
    ap를 첫번째 가변인자 주소로 맞춰준다.
    last = 마지막 고정인수
    ex) va_start(ap, c);
    .
  • type va_arg(va_list ap, type);
    ap를 type에 맞춰 읽어주고, 다음 가변인자 위치로 움직여준다.
    • gcc 표준 c에 따르면 자료형이 int 보다 작다면 int로, float 라면, double로 읽어야 한다.
      char, bool, short -> int
      float -> double
      예외적으로 visual stdio에서만 char를 읽을때 그대로 char로 읽을 수 있는 등의 경우가 있다.
      https://dojang.io/mod/page/view.php?id=578
      .
  • void va_copy(va_list dest, va_list src);
    dest(va_start로 초기화되지 않은)로 src를 copy
    va_start()로 초기화, va_arg()로 접근, va_end()로 마무리, copy본도 똑같은 과정을 거쳐야 한다.
    아직 써보진 못했다.
    .
  • void va_end(va_list ap);
    한 function 안에 va_start 로 시작, va_end로 끝을 맺어야한다.
    // 왜 한 함수안에서 일어나야 하는 걸까? ap를 다른 함수로 넘겨줘서 사용했을때 영향을 받는가?
    .
  • 참고 링크
    man 3 stdarg - https://linux.die.net/man/3/stdarg
    https://dojang.io/mod/page/view.php?id=578
    https://norux.me/19
    https://jangsalt.tistory.com/entry/가변-인수-vastart-vaend-vaarg-valist

0개의 댓글