Namespaces
Variants

va_arg

From cppreference.net
Definido en el encabezado <stdarg.h>
T va_arg ( va_list ap, T ) ;

La macro va_arg se expande a una expresión de tipo T que corresponde al siguiente parámetro del va_list ap .

Antes de llamar a va_arg , ap debe ser inicializado mediante una llamada a va_start o va_copy , sin ninguna llamada intermedia a va_end . Cada invocación de la macro va_arg modifica ap para que apunte al siguiente argumento variable.

Si el tipo del siguiente argumento en ap (después de las promociones) no es compatible con T , el comportamiento es indefinido, a menos que:

  • un tipo es un tipo entero con signo, el otro tipo es el tipo entero sin signo correspondiente, y el valor es representable en ambos tipos; o
  • un tipo es puntero a void y el otro es un puntero a un tipo carácter.

Si va_arg es llamado cuando no hay más argumentos en ap , el comportamiento es indefinido.

Contenidos

Parámetros

ap - una instancia del tipo va_list
T - el tipo del siguiente parámetro en ap

Valor expandido

el siguiente parámetro variable en ap

Ejemplo

#include <math.h>
#include <stdarg.h>
#include <stdio.h>
double stddev(int count, ...)
{
    double sum = 0;
    double sum_sq = 0;
    va_list args;
    va_start(args, count);
    for (int i = 0; i < count; ++i)
    {
        double num = va_arg(args, double);
        sum += num;
        sum_sq += num*num;
    }
    va_end(args);
    return sqrt(sum_sq / count - (sum / count) * (sum / count));
}
int main(void)
{
    printf("%f\n", stddev(4, 25.0, 27.3, 26.9, 25.7));
}

Salida:

0.920258

Referencias

  • Estándar C23 (ISO/IEC 9899:2024):
  • 7.16.2.2 La macro va_arg (p: TBD)
  • Estándar C17 (ISO/IEC 9899:2018):
  • 7.16.1.1 The va_arg macro (p: TBD)
  • Estándar C11 (ISO/IEC 9899:2011):
  • 7.16.1.1 La macro va_arg (p: 269-270)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 7.15.1.1 The va_arg macro (p: 249-250)
  • Estándar C89/C90 (ISO/IEC 9899:1990):
  • 4.8.1.2 La macro va_arg

Véase también

(C99)
realiza una copia de los argumentos de función variádicos
(macro de función)
finaliza el recorrido de los argumentos de función variádicos
(macro de función)
contiene la información necesaria para va_start , va_arg , va_end , y va_copy
(typedef)
habilita el acceso a los argumentos de función variádicos
(macro de función)