Namespaces
Variants

va_start

De es.cppreference.net
Definido en el encabezado <stdarg.h>
void va_start( va_list ap, parmN );
(hasta C23)
void va_start( va_list ap, ... );
(desde C23)

La va_start macro permite acceder a los argumentos variablesdespués del argumento con nombre parmN(hasta C23).

va_start debe invocarse con una instancia de un objeto va_list válido ap antes de cualquier llamada a va_arg.

Si parmN se declara con register especificador de clase de almacenamiento, con un tipo de arreglo, con un tipo de función, o con un tipo no compatible con el tipo que resulta de las promociones de argumentos predeterminadas, el comportamiento es indefinido.

(hasta C23)

Si hay más de un argumento presente para va_start, los tokens de preprocesamiento que comprenden el segundo argumento y siguientes se descartan. Si alguno de esos argumentos se expande para incluir paréntesis desbalanceados, o un token de preprocesamiento que no se convierte en un token, el comportamiento es indefinido.

(desde C23)

Parámetros

ap - una instancia del tipo va_list
parmN - el parámetro con nombre que precede al primer parámetro variable

Valor expandido

(ninguno)

Ejemplo

#include <stdarg.h>
#include <stdio.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
}

Posible salida:

150
150

Referencias

  • Estándar C23 (ISO/IEC 9899:2024):
  • 7.16.1.4 La macro va_start (p: 290-292)
  • Estándar C17 (ISO/IEC 9899:2018):
  • 7.16.1.4 La macro va_start (p: 198-199)
  • Estándar C11 (ISO/IEC 9899:2011):
  • 7.16.1.4 La macro va_start (p: 271-272)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 7.16.1.4 La macro va_start (p: 251-252)
  • Estándar C89/C90 (ISO/IEC 9899:1990):
  • 4.8.1.1 La macro va_start

Véase también

accede al siguiente argumento de función variádica
(macro de función)
hace una copia de los argumentos de función variádica
(macro de función)
finaliza el recorrido de los argumentos de función variádica
(macro de función)
contiene la información necesaria para va_start, va_arg, va_end, y va_copy
(typedef)
Documentación de C++ para va_start