STDARG(3)

명칭
stdarg - 변수 인수 리스트

서식
<stdarg.h> void va_start(va_list ap, last) type va_arg(va_list ap, type) void va_end(va_list ap)

해설
함수는 다양한 형태의 다양한 수의 인수로 호출할 수 있습니다. 인클루드 파일 <stdarg.h> (은)는, 형태 (va_list) (을)를 선언해, 불려 가는 함수에는 숫자와 형태가 미지의 인수 리스트를 스텝 하기 위해서 3 개의 매크로를 정의합니다.

불려 가는 함수는, va_list 형태의 오브젝트를 선언할 필요가 있습니다. 이것은, 매크로 va_start(), va_arg(), va_end() 에 의해 사용됩니다.

va_start() 매크로는, va_arg() (와)과 va_end() 하지만 후에 사용한다 ap (을)를 초기화해, 최초로 호출할 필요가 있습니다.

파라미터 last (은)는 변수 인수 리스트의 전의 마지막 파라미터의 이름입니다. 즉, 호출 함수가 형태를 인식하고 있는 마지막 파라미터입니다.

이 파라미터의 주소는 va_start() 매크로로 사용되므로, 레지스터 변수 또는 함수 또는 배열형으로서 선언해 되지 않습니다.

va_start() 매크로는 값을 돌려주지 않습니다.

va_arg() 매크로는, 호출의 다음의 인수의 형태와 값이 있는 식에 전개됩니다. 파라미터 ap (은)는, va_start() 에 의해 초기화된다 va_list ap 입니다. va_arg() (이)가 호출할 것에 ap (은)는 수정되어 다음의 호출이 다음의 인수를 돌려줍니다. 파라미터 type (은)는, 지정형의 오브젝트를 가리키는 포인터의 형태가 * 를 type 에 추가하는 것만으로 얻을 수 있도록(듯이) 지정된 형명입니다.

다음의 인수가 없는 경우, 또는 type 하지만 (디폴트의 인수 생성에 따라 생성된 것 같은) 실제의 다음의 인수의 형태와 호환성이 없는 경우, 랜덤인 에러가 발생합니다.

va_start() 매크로의 뒤의 최초의 va_arg() 매크로의 사용에 의해, last 의 후의 인수가 돌려주어집니다. 연속적인 호출에 의해, 나머지의 인수의 값이 돌려주어집니다.

va_end() 매크로는, 변수 인수 리스트가 va_start() 에 의해 초기화되는 함수의 정상적인 귀가를 취급합니다.

va_end() 매크로는 값을 돌려주지 않습니다.

사용예
함수 foo (은)는, 형식 캐릭터의 string를 채택해 형태를 기초로 해 각 형식 캐릭터에 대응하는 인수를 인쇄합니다.

    void foo(char *fmt, ...)
    {
    	va_list ap;
    	int d;
    	char c, *s;
    	va_start(ap, fmt);
    	while (*fmt)
    		switch(*fmt++) {
    		case 's':			/* string */
    			s = va_arg(ap, char *);
    			printf("string %s\n", s);
    			break;
    		case 'd':			/* 정수 */
    			d = va_arg(ap, int);
    			printf("int %d\n", d);
    			break;
    		case 'c':			/* 캐릭터 */
    			/* 주의: 캐릭터는 정수를 생성한다.  */
    			c = va_arg(ap, int);
    			printf("char %c\n", c);
    			break;
    		}
    	va_end(ap);
    }

표준
va_start(), va_arg(), va_end() 의 각 매크로는 isoC 에 적합하고 있습니다.

호환성
이러한 매크로는, 옮겨놓을 수 있는 역사적인 매크로와 호환성이 선 후방 호환 버젼은 인클루드 파일 <varargs.h> 의 안에 있습니다.

버그
varargs 매크로와 달리, stdarg 매크로에서는, 프로그래머는, 고정한 인수가 없다 함수를 작성할 수가 없습니다. 이 문제는, 주로 varargs 코드를 stdarg 코드로 변환할 때 작업을 일으키게 합니다만, vfprintf(3) (와)과 같이, va_list 인수를 취하는 함수에 모든 인수를 건네주려고 하는 각종의 함수에 대해서도 곤란을 생기게 합니다.