va_arg() – va_copy() – va_end() – va_start() — 가변 인수 리스트 처리

형식

#include <stdarg.h>
var_type va_arg(va_list arg_ptr, var_type);
void va_copy(va_list dest, va_list src);
void va_end(va_list arg_ptr);
void va_start(va_list arg_ptr, variable_name);

언어 레벨

ANSI

스레드세이프

설명

va_arg(), va_copy(), va_end(), va_start() 함수는 가변 개수의 선택적 인수 및 필수 인수의 고정 수를 사용할 때 함수에 대한 인수에 액세스합니다. 함수에 대한 보통 매개변수로 필수 인수를 선언하고 매개변수명을 통해 인수에 액세스합니다.

va_start()va_arg(), va_copy(), va_end()에 대한 후속 호출에 대해 arg_ptr 포인터를 초기화합니다.

인수 variable_name은 매개변수 리스트(선행 , ...)에서 맨 오른쪽 명명된 매개변수 ID입니다. va_arg() 전에 va_start()를 사용하십시오. 대응하는 va_start()va_end() 매크로는 동일한 함수에 있어야 합니다.

va_copy()va_start()dest에 적용한 후 src의 현재 상태에 도달하는 데 이전에 사용된 것과 동일한 순서로 va_arg()를 사용한 경우와 같이 destsrc의 사본으로 초기화합니다. va_copy() 또는 va_start()는 동일한 dest에 대한 va_end()의 중간 호출 없이 dest를 다시 초기화하도록 호출해야 합니다.

va_arg() 함수는 arg_ptr로 지정된 위치에서 지정된 var_type 값을 검색하고 리스트에서 다음 인수를 가리키도록 arg_ptr을 늘립니다. va_arg() 함수는 함수 내에서 임의의 횟수만큼 리스트에서 인수를 검색할 수 있습니다. var_type 인수는 int, long, decimal, double, struct, union, pointer 중 하나이거나 typedef의 경우 다음 유형 중 하나여야 합니다.

va_end() 함수는 매개변수 스캔 끝을 나타내는 데 필요합니다. va_start()va_copy()의 각 호출은 동일한 함수에서 va_end()에 대응하는 호출과 일치해야 합니다.

항상 호출된 함수에서 인수 수를 판별할 수는 없으므로 호출 함수는 호출된 함수로 인수 개수를 전달해야 합니다. 인수 개수를 판별하기 위해 함수는 널 포인터를 사용하여 필수 인수 중 하나로 선택적 인수 개수를 전달하거나 리스트 끝을 알릴 수 있습니다. 예를 들어, printf() 함수는 format-string 인수를 통해 인수 개수를 알려줄 수 있습니다.

리턴값

va_arg() 함수는 현재 인수를 리턴합니다. va_copy(), va_end(), va_start() 함수는 값을 리턴하지 않습니다.

이 예는 각 인수를 두 번 인쇄하는 함수에 가변 개수의 인수를 전달합니다.
#include <stdio.h>
#include <stdarg.h>
 
int vout(int max, ...);
 
int main(void)
{
   vout(2, "Sat", "Sun");
   printf("\n");
   vout(3, "Mon", "Tues", "Wed");
}
 
int vout(int max, ...)
{
   va_list arg_ptr;
   va_list args_copy;
   int args;
   char *day;
   va_start(arg_ptr, max);
   va_copy(args_copy, arg_ptr);
   args = 0;
   while(args < max)
   {
      day = va_arg(arg_ptr, char *);
      printf("Day: %s\n", day);
      args++;
   }
   va_end(arg_ptr);

   args = 0;
   while(args < max)
   {
      day = va_arg(args_copy, char *);
      printf("Day: %s\n", day);
      args++;
   }
   va_end(args_copy);
}
 
/******************  Output should be similar to:  ****************
Day: Sat
Day: Sun
Day: Sat
Day: Sun

Day: Mon
Day: Tues
Day: Wed
Day: Mon
Day: Tues
Day: Wed
*/