Macro de la biblioteca C -va_arg()
Biblioteca estándar de C - <stdarg.h>
va_argLa macro es de la biblioteca estándar de C<stdarg.h>Una macro en el archivo de encabezado, utilizada para obtener secuencialmente el valor de cada argumento variable en una función de argumentos variables. Después de usarva_startla macro para inicializarva_listla variable, se usa para acceder al siguiente argumento en la lista de argumentos variables.
Declaración
La siguiente es la declaración de la macro va_arg().
type va_arg(va_list ap, type);
Parámetros
va_list ap: unava_listvariable de tipo, que ya ha sidova_startinicializada por la macro, apuntando a la posición actual de la lista de argumentos variables.type: el tipo del siguiente argumento a obtener. Debe ser un tipo claramente identificable.
Valor de retorno
Devuelve el siguiente argumento de la lista de argumentos variables actual, de tipo type.
Pasos de uso
- En una función de argumentos variables, use
va_startla macro para inicializarva_listla variable. - Use
va_argla macro para obtener secuencialmente cada argumento variable. - Use
va_endla macro para limpiarva_listla variable.
Ejemplo
El siguiente es un ejemplo que usava_argla macro. El programa define una función de argumentos variables para calcular la suma de un número variable de argumentos:
Ejemplo
#include <stdarg.h>
// Función de argumentos variables, calcula la suma de los argumentos
int sum(int count, ...) {
int total = 0;
va_list args;
// Inicializa args para acceder a los argumentos variables
va_start(args, count);
// Obtiene los argumentos variables uno por uno y los acumula en total
for (int i = 0; i < count; i++) {
total += va_arg(args, int);
}
// Limpia args
va_end(args);
return total;
}
int main() {
printf("Sum of 1, 2, 3: %d\n", sum(3, 1, 2, 3)); // Salida 6
printf("Sum of 4, 5, 6, 7: %d\n", sum(4, 4, 5, 6, 7)); // Salida 22
return 0;
}
Compilemos y ejecutemos el programa anterior, esto producirá el siguiente resultado:
Sum of 1, 2, 3: 6 Sum of 4, 5, 6, 7: 22
Explicación
va_list args;: declarar unava_listvariable de tipoargs, utilizada para almacenar la información de la lista de argumentos variables.va_start(args, count);: inicializarargspara acceder a loscountargumentos variables que comienzan después.total += va_arg(args, int);: usarva_argla macro para obtener el siguiente argumento variable, aquí se asume que todos soninttipo, y se acumulan entotalla variable.va_end(args);: limpiarargs, para liberar recursos y evitar un comportamiento indefinido.
Precauciones
va_argLa macro debeva_startusarse después de, yva_endantes de usarse.typeEl parámetro debe ser un tipo definido y coincidir con el tipo real de los argumentos variables.- Si al llamar
va_argse excede el número de argumentos variables, el comportamiento es indefinido. - Usar
va_endpara limpiarva_listla variable es obligatorio, para evitar posibles fugas de recursos o comportamiento indefinido.