공부/이모저모

C언어 가변인자함수 구현 (...)

JUNFUTURE 2024. 4. 12. 17:18

C 언어에서 ... 키워드는 가변 인자 목록(variadic arguments)을 의미합니다. 이 키워드는 함수가 고정된 수의 인자 대신 다양한 수의 인자를 받을 수 있게 해 줍니다. 이는 특히 여러 다른 타입의 인자를 다루거나, 호출 시점에 정확한 인자의 수가 결정되지 않는 경우에 유용합니다.

가변 인자 함수의 구현 방법

가변 인자 함수를 구현할 때는 다음과 같은 표준 라이브러리 매크로를 사용합니다:

  1. va_list: 인자 목록을 처리하기 위한 변수 타입입니다.
  2. va_start: 가변 인자 목록의 초기화를 시작합니다. 첫 번째 매크로 인자는 va_list 타입이고, 두 번째는 가변 인자 바로 앞의 고정된 인자입니다.
  3. va_arg: 가변 인자 목록에서 다음 인자를 가져옵니다. 이 매크로는 리스트와 반환할 데이터 타입을 인자로 받습니다.
  4. va_end: 가변 인자 처리를 종료하고 관련 리소스를 정리합니다.

예제: 가변 인자 함수의 사용

아래 예제에서는 여러 개의 정수를 받아 합을 반환하는 함수를 보여줍니다.

#include <stdarg.h>
#include <stdio.h>

int sum(int num_args, ...) {
    int total = 0;
    va_list va;
    va_start(va, num_args);

    for (int i = 0; i < num_args; i++) {
        total += va_arg(va, int);
    }

    va_end(va);
    return total;
}

int main() {
    printf("Sum: %d\n", sum(3, 1, 2, 3));  // 출력: Sum: 6
    return 0;
}
 

이 코드에서 sum 함수는 첫 번째 인자로 정수의 개수를 받고, 그 뒤로 가변 개수의 정수 인자를 받습니다. va_start를 통해 가변 인자 목록을 초기화하고, va_arg로 각 인자를 가져와 합산한 후, va_end로 종료합니다.

당신의 코드에서의 가변 인자 사용

제시된 UT_DefaultStubImpl 함수에서 ...는 함수가 다양한 수와 타입의 인자를 받을 수 있음을 나타냅니다. 이 함수는 va_start와 va_end를 사용해 인자 목록을 관리하고, UT_DefaultStubImplWithArgs로 전달하여 처리를 계속합니다. 이런 방식으로, 테스트 스텁 함수는 호출 시점에 어떤 인자들이 제공될지 알 수 없는 상황에 유연하게 대응할 수 있습니다.