stdarg(3) Library Functions Manual stdarg(3) stdarg, va_start, va_arg, va_end, va_copy - (libc -lc) #include void va_start(va_list ap, last); type va_arg(va_list ap, type); void va_end(va_list ap); void va_copy(va_list dest, va_list src); . va_list . va_list va_start() va_arg() va_end(). va_start() va_start() ap va_arg() va_end() . last . va_start() . va_arg() va_arg() . ap va_list ap va_start(). va_arg() ap . type * type. va_arg() va_start() last. . type ( ) . ap va_arg(ap,type), ap . va_end() va_start() va_end() . va_end(ap) ap . va_start() va_end() . va_end() . va_copy() va_copy() ( ) src dest. va_start() dest last va_arg() src. va_list . ( ) va_list aq = ap; ( 1) va_list aq; *aq = *ap; va_start() va_arg() . va_end() . C99 va_copy() va_list aq; va_copy(aq, ap); ... va_end(aq); va_copy() va_end() . va_copy() __va_copy . attributes(7). +------------+------------------------------------+--------------------+ || | | +------------+------------------------------------+--------------------+ |va_start(), | | MT-Safe | |va_end(), | | | |va_copy() | | | +------------+------------------------------------+--------------------+ |va_arg() | | MT-Safe race:ap | +------------+------------------------------------+--------------------+ C11, POSIX.1-2008. va_start() va_arg() va_end() C89, POSIX.1-2001. va_copy() C99 POSIX.1-2001. varargs stdarg . varargs stdarg va_list vfprintf(3). foo . #include #include void foo(char *fmt, ...) /* '...' is C syntax for a variadic function */ { va_list ap; int d; char c; char *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': /* int */ d = va_arg(ap, int); printf("int %d\n", d); break; case 'c': /* char */ /* need a cast here since va_arg only takes fully promoted types */ c = (char) va_arg(ap, int); printf("char %c\n", c); break; } va_end(ap); } vprintf(3), vscanf(3), vsyslog(3) 3 . . : . 6.18 17 2025 stdarg(3)