liveBook · Manning

Va_start

As explained in Modern C

va_start is a C standard library macro that initializes a va_list for accessing a function's variable arguments.

va_start initializes a va_list so a variadic function can access arguments after its final named parameter. Pass the va_list object itself—not its address—and identify that last named parameter. section 16.5.2

Initializing a variable-argument list

double sumIt(size_t n, ...) { double ret = 0.0; va_list va; va_start(va, n); for (size_t i = 0; i < n; ++i) ret += va_arg(va, double); va_end(va); return ret; } Here, n is the last named parameter, so va_start(va, n) prepares va for va_arg. The function must track the number of values itself; va_start and va_arg provide no list length. section 16.5.2

Passing the initialized list onward

va_start can prepare arguments for an existing library function instead of manually processing them: va_list va; va_start(va, format); ret = vfprintf(iodebug, format, va); va_end(va); This pattern uses va_start and va_end to delimit the va_list's use. section 16.5.2

1   void va_start(va_list ap, parmN);
2   void va_end(va_list ap);
3   type va_arg(va_list ap, type);
4   void va_copy(va_list dest, va_list src);


!@%STYLE%@!
{"css":"{\"css\": \"font-weight: bold;\"}","target":"[[{\"line\":0,\"ch\":0},{\"line\":0,\"ch\":1}],[{\"line\":0,\"ch\":4},{\"line\":0,\"ch\":8}],[{\"line\":1,\"ch\":4},{\"line\":1,\"ch\":8}],[{\"line\":3,\"ch\":4},{\"line\":3,\"ch\":8}],[{\"line\":0,\"ch\":9},{\"line\":0,\"ch\":17}],[{\"line\":0,\"ch\":18},{\"line\":0,\"ch\":25}],[{\"line\":1,\"ch\":16},{\"line\":1,\"ch\":23}],[{\"line\":2,\"ch\":16},{\"line\":2,\"ch\":23}],[{\"line\":3,\"ch\":17},{\"line\":3,\"ch\":24}],[{\"line\":1,\"ch\":0},{\"line\":1,\"ch\":1}],[{\"line\":0,\"ch\":4},{\"line\":0,\"ch\":8}],[{\"line\":1,\"ch\":4},{\"line\":1,\"ch\":8}],[{\"line\":3,\"ch\":4},{\"line\":3,\"ch\":8}],[{\"line\":1,\"ch\":9},{\"line\":1,\"ch\":15}],[{\"line\":0,\"ch\":18},{\"line\":0,\"ch\":25}],[{\"line\":1,\"ch\":16},{\"line\":1,\"ch\":23}],[{\"line\":2,\"ch\":16},{\"line\":2,\"ch\":23}],[{\"line\":3,\"ch\":17},{\"line\":3,\"ch\":24}],[{\"line\":2,\"ch\":0},{\"line\":2,\"ch\":1}],[{\"line\":2,\"ch\":9},{\"line\":2,\"ch\":15}],[{\"line\":0,\"ch\":18},{\"line\":0,\"ch\":25}],[{\"line\":1,\"ch\":16},{\"line\":1,\"ch\":23}],[{\"line\":2,\"ch\":16},{\"line\":2,\"ch\":23}],[{\"line\":3,\"ch\":17},{\"line\":3,\"ch\":24}],[{\"line\":3,\"ch\":0},{\"line\":3,\"ch\":1}],[{\"line\":0,\"ch\":4},{\"line\":0,\"ch\":8}],[{\"line\":1,\"ch\":4},{\"line\":1,\"ch\":8}],[{\"line\":3,\"ch\":4},{\"line\":3,\"ch\":8}],[{\"line\":3,\"ch\":9},{\"line\":3,\"ch\":16}],[{\"line\":0,\"ch\":18},{\"line\":0,\"ch\":25}],[{\"line\":1,\"ch\":16},{\"line\":1,\"ch\":23}],[{\"line\":2,\"ch\":16},{\"line\":2,\"ch\":23}],[{\"line\":3,\"ch\":17},{\"line\":3,\"ch\":24}],[{\"line\":0,\"ch\":18},{\"line\":0,\"ch\":25}],[{\"line\":1,\"ch\":16},{\"line\":1,\"ch\":23}],[{\"line\":2,\"ch\":16},{\"line\":2,\"ch\":23}],[{\"line\":3,\"ch\":17},{\"line\":3,\"ch\":24}]]"}
!@%STYLE%@!

Compare the pseudo-interfaces for va_start, va_end, va_arg, and va_copy. section 16.5.2

How Modern C covers it

How deep it goes
Explains the initialization operand and lifecycle, but defers representation details and argument type encoding.
Examples
Uses a double-summing variadic function and a debugging wrapper that forwards arguments to vfprintf.
What it assumes
Assumes familiarity with C functions and named parameters while introducing va_list and variadic argument handling.
What you can do after
Build it from scratch by initializing, consuming or forwarding, and then ending a va_list.
How it connects
Connects va_start with va_list, va_arg, va_end, va_copy, variadic functions, and vfprintf.

Also explained in

Compare how 2 books explain va_start →

Related concepts

This explainer was generated by Manning's knowledge graph from the text of Modern C. The section links point to the parts of the book it draws on.