Namespaces
Variants

va_arg

De es.cppreference.net
 
 
Biblioteca de utilidades
Soporte del lenguaje
Soporte de tipos (tipos básicos, RTTI)
Macros de prueba de características de la biblioteca (C++20)
Utilidades de programa
Funciones variádicas
Soporte de corrutinas (C++20)
Soporte de contratos (C++26)
Comparación de tres vías
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Utilidades generales
Operadores relacionales (obsoleto en C++20)
 
 
Definido en el encabezado <cstdarg>
T va_arg( std::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 llamadas intermedias 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 no está definido, a menos que:

  • un tipo sea un tipo entero con signo, el otro tipo sea el tipo entero sin signo correspondiente, y el valor sea representable en ambos tipos; o
  • un tipo sea un puntero a void y el otro sea un puntero a un tipo carácter (char, signed char, o unsigned char).

Si se llama a va_arg cuando no hay más argumentos en ap, el comportamiento no está definido.

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 <cstdarg>
#include <cstdio>
#include <iostream>
void print_variance(std::size_t count, const char* fmt, ...)
{
    double sum = 0;
    double sum_sq = 0;
    std::va_list args;
    va_start(args, fmt);
    for (std::size_t i = count; i--;)
    {
        double num = va_arg(args, double);
        sum += num;
        sum_sq += num*num;
    }
    va_end(args);
    std::printf(fmt, sum_sq / count - (sum / count) * (sum / count));
}
void nano_printf(const char* fmt, ...)
{
    std::va_list args;
    va_start(args, fmt);
    for (const char* p = fmt; *p != '\0'; ++p)
    {
        switch (*p)
        {
        case '%':
            switch (*++p) // leer símbolo de formato
            {
                case 'i':
                    std::cout << va_arg(args, int);
                    continue;
                case 'f':
                    std::cout << va_arg(args, double);
                    continue;
                case 's':
                    std::cout << va_arg(args, const char*);
                    continue;
                case 'c':
                    std::cout << static_cast<char>(va_arg(args, int));
                    continue;
                case '%':
                    std::cout << '%';
                    continue;
                /* ...más casos... */
            }
            break; // error de formato...
        case '\n':
            std::cout << '\n';
            continue;
        case '\t':
            std::cout << '\t';
            continue;
        /* ...más casos... */
        }
        std::cout << *p;
    }
    va_end(args);
}
int main()
{
    print_variance(4, "%f\n", 25.0, 27.3, 26.9, 25.7);
    nano_printf("Args: %i%% %c%f %s\n", 42, '#', 3.14, "C++");
}

Salida:

0.846875
Args: 42% #3.14 C++

Véase también

permite el acceso a los argumentos de función variádicos
(macro de función)
(C++11)
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)