va_arg
De es.cppreference.net
| 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
voidy el otro sea un puntero a un tipo carácter (char,signed char, ounsigned 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
Ejecutar este código
#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) |
|
|
Documentación de C
para
va_arg
|
|