va_copy 예제

va_copy는 현재 상태의 인수 목록의 복사본을 만듭니다. src 매개 변수는 va_start로 이미 초기화되어야 합니다. va_arg 호출로 업데이트되었을 수 있지만 va_end로 재설정되지 않아야 합니다. dest에서 va_arg에 의해 검색되는 다음 인수는 src에서 검색된 다음 인수와 동일합니다. 이 구문에서 last_fixed_arg 이후의 타원(…)은 선택적 인수를 나타내기 위해 함수 프로토타입에 나타나야 하는 리터럴 타원입니다. 선택적 인수가 있는 함수는 하나 이상의 필수 인수도 사용해야 합니다. 선택적 인수를 나타내는 타원은 마지막 필수 매개 변수 다음의 매개 변수 목록의 마지막 항목이어야 합니다. 다음 예제에서는 함수 vop()의 프로토타입을 보여 주며, 두 개의 필수 인수(하나는 형식을 구성하기 위한 형식 포인터와 int 형식 int)와 선택적 인수의 가변 수인(함수 정의에서 매크로 va_start() va_va_를 사용합니다. arg(), va_copy() 및 va_end())를 사용하면 선택적 인수에 액세스할 수 있습니다. 모든 인수를 검색한 후 va_end는 포인터를 NULL로 재설정합니다. va_end함수가 반환되기 전에 va_start 또는 va_copy로 초기화된 각 인수 목록에서 호출되어야 합니다.

stdarg, va_start, va_arg, va_end, va_copy – 변수 인수 목록 va_arg는 현재 인수를 반환합니다. va_copy, va_start 및 va_end는 값을 반환하지 않습니다. va_start(), va_arg(및 va_end() 매크로는 C89를 준수합니다. C99는 va_copy() 매크로를 정의합니다. void va_start(va_list ap, 마지막); va_arg 유형(va_list ap, type); 보이드 va_end(va_list ap); void va_copy(va_list dest, va_list src); va_start() 매크로 의 매크로 이후 va_arg() 매크로를 처음 사용하면 마지막 이후에 인수를 반환합니다. 연속 호출은 나머지 인수의 값을 반환합니다. 첫 번째 선택적 인수 앞에 오는 prev_param 매개 변수입니다. varargs 매크로와 달리 stdarg 매크로는 프로그래머가 고정 된 인수없이 함수를 코딩하는 것을 허용하지 않습니다.

이 문제는 varargs 코드를 stdarg 코드로 변환할 때 주로 작업을 생성하지만 vfprintf(3)와 같은 va_list 인수를 취하는 함수에 모든 인수를 전달하려는 variadic 함수에 대해서도 어려움을 초래합니다. 인수 마지막변수 인수 목록 앞의 마지막 인수의 이름, 즉 호출 함수가 형식을 알고 있는 마지막 인수입니다.