On this page
va_start
Defined in header <stdarg.h> | 
      ||
|---|---|---|
 | 
      (until C23) | |
 | 
      (since C23) | 
The va_start macro enables access to the variable arguments following the named argument parmN(until C23).
va_start shall be invoked with an instance to a valid va_list object ap before any calls to va_arg.
If   | 
      (until C23) | 
Only the first argument passed to   | 
      (since C23) | 
Parameters
| ap | - | an instance of the va_list type | 
     
| parmN | - | the named parameter preceding the first variable parameter | 
Expanded value
(none)
Example
#include <stdio.h>
#include <stdarg.h>
 
int add_nums_C99(int count, ...)
{
    int result = 0;
    va_list args;
    va_start(args, count); // count can be omitted since C23
 
    for (int i = 0; i < count; ++i) {
        result += va_arg(args, int);
    }
 
    va_end(args);
    return result;
}
 
#if __STDC_VERSION__ > 201710L
// Same as above, valid since C23
int add_nums_C23(...)
{
    int result = 0;
    va_list args;
    va_start(args);
 
    int count = va_arg(args, int);
    for (int i = 0; i < count; ++i) {
        result += va_arg(args, int);
    }
 
    va_end(args);
    return result;
}
#endif
 
int main(void)
{
    printf("%d\n", add_nums_C99(4, 25, 25, 50, 50));
#if __STDC_VERSION__ > 201710L
    printf("%d\n", add_nums_C23(4, 25, 25, 50, 50));
#endif
}
   Possible output:
150
150
   References
- C17 standard (ISO/IEC 9899:2018):
 - 7.16.1.4 The va_start macro (p: 198-199)
 - C11 standard (ISO/IEC 9899:2011):
 - 7.16.1.4 The va_start macro (p: 271-272)
 - C99 standard (ISO/IEC 9899:1999):
 - 7.15.1.4 The va_start macro (p: 251-252)
 - C89/C90 standard (ISO/IEC 9899:1990):
 - 4.8.1.1 The va_start macro
 
See also
| accesses the next variadic function argument  (function macro)  | 
     |
| 
       
        (C99)
         | 
      makes a copy of the variadic function arguments  (function macro)  | 
     
| ends traversal of the variadic function arguments  (function macro)  | 
     |
| holds the information needed by va_start, va_arg, va_end, and va_copy  (typedef)  | 
     |
C++ documentation for va_start | 
     |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
 https://en.cppreference.com/w/c/variadic/va_start