<cstdarg>

The <cstdarg> header is the C++ version of the C standard <stdarg.h> header, which declares macros for accessing the arguments to a function that takes a variable number of arguments, that is, a function that is declared with an ellipsis as the last parameter.

A function that takes a variable number of arguments (called a variadic function) must have some way of knowing how many arguments have actually been passed to the function and what their types are. For example, the printf function (in <cstdio>) uses its format string to determine the number and type of arguments.

Example 13-8 shows how a function can use the <cstdarg> macros. The max function takes at least two arguments. The first is a count of the number of remaining arguments; the count must be positive. The template parameter specifies the type of each argument that follows the count.

Example 13-8. Finding the maximum value of any number of arguments

#include <cassert>
#include <cstdarg>
   
// Use a trivial wrapper class to ensure that va_end is called.
class varargs {
public:
  ~varargs(  ) { va_end(ap); }
  std::va_list& ap;
};
   
template <typename T>
T max(unsigned count, ...)
{
  assert(count > 0);
  varargs va;
  va_start(va.ap, count);
  T result = va_arg(va.ap, T);  // Get first argument.
  while (--count > 0) {
    T arg = va_arg(va.ap, T);   // Get successive arguments.
    if (arg > result)
      result = arg;             // Remember the largest.
  }
  return result;
}
   
int main(  )
{
  int a, b, c, d;
  ...
  int x = max<int>(4, a, b, c, d);
  int y = max<int>(2, x, 42);
  return y;
}