파도가 칠 때는 서핑을

Soon as possible

Wait!

공부/C\C++

[C] 가변인자, 가변인자 함수

hyeonhki 2021. 3. 18. 10:54
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