Namespaces
Variants

va_start

From 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 macro va_start permite acceder a los argumentos variables que siguen al argumento nombrado parmN (hasta C23) .

va_start deberá ser invocado con una instancia de un objeto va_list válido ap antes de cualquier llamada a va_arg .

Si parmN se declara con el especificador de clase de almacenamiento register , 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.

(until C23)

Solo se evalúa el primer argumento pasado a va_start . Cualquier argumento adicional no se expande ni se utiliza de ninguna manera.

(since C23)

Contenidos

Parámetros

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

Valor expandido

(ninguno)

Ejemplo

#include <stdio.h>
#include <stdarg.h>
int add_nums_C99(int count, ...)
{
    int result = 0;
    va_list args;
    va_start(args, count); // count puede omitirse desde C23
    for (int i = 0; i < count; ++i) {
        result += va_arg(args, int);
    }
    va_end(args);
    return result;
}
#if __STDC_VERSION__ > 201710L
// Igual que arriba, válido desde 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
}

Salida posible:

150
150

Referencias

  • 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.15.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)
(C99)
realiza 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)