stdarg(3) Library Functions Manual stdarg(3) stdarg, va_start, va_arg, va_end, va_copy - LIBRARY Standard C library (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(), va_end(), | | MT-Safe | |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. CAVEATS 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) Alexander Golubev , Azamat Hackimov , Hotellook, Nikita , Spiros Georgaras , Vladislav , Yuri Kozlov ; GNU 3 , . . , , . Linux man-pages 6.06 31 2023 . stdarg(3)