오다기리 박의 알고리즘 노트

가변 인수 함수란? (va_start(), va_end(), va_arg 본문

프로그래밍 잡지식

가변 인수 함수란? (va_start(), va_end(), va_arg

오다기리 박 2021. 8. 11. 17:15
  • 가변 인수 : 인수의 개수와 타입이 미리 정해져 있지 않다는 뜻이며 그런 인수를 사용하는 함수를 가변인수 함수라고 함.

    • 예) int printf(const char *format, …);

      • 첫 번째 인수는 format이라는 이름의 문자열 상수로 서식 문자열(고정 인수)이라고도 한다.

      • 두번 째 이후의 인수에는 타입과 인수 이름이 명시되어 있지 않으며 대신 생략 기호인 … 가 적혀 있다.

      • 생략기호는 컴파일러에게 이후의 인수에 대해서는 개수와 타입을 점검하지 않도록 하는데 이 기호에 의해 가변 인수가 가능해진다.

      • 컴파일러는 … 이후의 인수에 대해서는 개수가 몇개든지 어떤 타입이든지 상관하지 않고 있는 그대로 함수에게 넘겨 주므로 얼마든지 많은 임의 타입의 인수들을 전달할 수 있다.

  • 가변 인수 함수 내부에서 인수를 읽기 위한 매크로 함수들
    void VarFunc(int Fix, …)
    {
    va_list ap;
    va_start(ap,Fix);
    while(모든 인수를 다 읽을 때까지){
    va_arg(ap, 인수타입);
    }
    va_end(ap);
    }

    • va_list  : 함수로 전달되는 인수들은 스택에 저장되며 함수는 스택에서 인수를 꺼내 쓴다. 스택에 있는 가변 인수를 읽을 때 현재 읽고 있는 번지를 기억하기 위한 포인터 변수이다.

    • va_start(ap, 마지막고정인수) : 가변 인수를 읽기 위한 준비를 하는데 ap 포인터 변수가 첫 번째 가변 인수를 가리키도록 초기화하는 역할. va_start 내부에서는 마지막 고정 인수 다음 번지로 ap를 맞추어 주므로 이후부터 ap번지를 읽으면 순서대로 가변 인수를 읽을 수 있다.

    • va_arg(ap, 인수타입) : ap 위치에서 타입에 맞는 값을 읽어 리턴해주며 또한 ap를 다음 가변 인수 위치로 옮겨준다.

    • va_end(ap) : 가변 인수를 다 읽은 후 뒷정리.


  • 가변 인수 함수의 조건

    • 반드시 하나 이상의 고정 인수를 가져아 함.


'프로그래밍 잡지식' 카테고리의 다른 글

스마트 포인터  (0) 2021.08.11
그리스 문자  (0) 2021.08.11
문자열을 모두 소문자로 변경하기  (0) 2021.08.11
프로세스 이름으로 프로세스 ID찾기  (0) 2018.08.25