Entre los tipos de funciones proporcionados por este idioma se encuentran las funciones "variádicas". Estos tipos de funciones tienen la flexibilidad de contener un número dinámico o variable de argumentos de entrada.
En esto Pista de Linux artículo, el VA_ARG La macro, que es un componente básico de este tipo de función y se utiliza para recuperar los datos de los argumentos de entrada, se explica en detalle en detalle.
Veremos una explicación detallada de su operación y sintaxis. Luego, pondremos en práctica lo que hemos aprendido en un ejemplo práctico en el que crearemos una función variádica paso a paso con fragmentos e imágenes de código que muestran cómo el VA_ARG Macro funciona en el idioma C.
sintaxis de macro de VA_ARG
Escriba VA_ARG (VA_LIST AP, TIPE)Definición de una función variádica
Antes de entrar en más detalles sobre la macro VA_ARG, Echemos un vistazo rápido a qué es una función variádica.
Estas funciones no tienen un número fijo de argumentos de entrada, pero el número de estos argumentos se adapta a lo que el programador envía con cada llamada.
Un ejemplo de esto es la función variádica ampliamente utilizada printf (), cuyos argumentos de entrada pueden ser solo una cadena, una cadena y una variable, o un puntero, o varios de ellos.
A continuación, veremos cómo definir una función variádica:
Función de tipo (tipo variable, ...);Como vemos en la definición, al crear una función de este tipo, debemos especificar en su declaración al menos un argumento de entrada declarado y su tipo, seguido de un elipsis separado por comas que representa los argumentos variables o desconocidos.
Las variables y las macros que usan las funciones variádicas, como VA_ARG, se definen en el "stdarg.encabezado. Entonces, para usarlos, necesitamos incluirlos en nuestro ".Código C "o su encabezado de la siguiente manera:
#incluirA continuación, veamos en detalle de qué se tratan las macros que componen la función variádica.
Argumentos de entrada y macros de una función variádica
En las funciones variádicas, se utilizan varias macros y tipos de variables para procesar los argumentos de entrada que el programador envía con cada llamada. Estas macros y su uso dentro de la función se muestran a continuación.
VA_LIST APEl objeto AP es de tipo VA_List y almacena información sobre los argumentos de entrada. Luego, apunta a la posición actual en el orden de recuperación de los datos de entrada de la lista.
Una vez declarado, el objeto VA_LIST debe inicializarse con la macro VA_Start.
void va_start (VA_LIST AP, último);El Macro VA_Start se llama primero cuando se llama a una función variádica. Inicializa el objeto AP que apunta al primer argumento desconocido en la lista.
escriba VA_ARG (VA_LIST AP, TIPO);Esta macro devuelve el siguiente argumento de entrada apuntado por AP de la lista de argumentos. El tipo de datos devuelto se especifica en el tipo.
Tan pronto como VA_ARG recupera los datos, AP incrementa su valor mediante la referencia al siguiente argumento de entrada.
Esta macro no devuelve un valor predeterminado que indica que la lista de argumentos de entrada ha alcanzado su final. Por lo tanto, el programador debe asegurarse de que se genere un método seguro que indique si todavía hay argumentos en la lista que se pueden extraer o no.
Un método seguro consiste en incluir, en cada llamada a la función variádica, un valor constante y único que puede interpretarse en el cuerpo de la función como un indicador de "no quedan más parámetros" en el último parámetro de entrada.
void VA_END (VA_LIST AP);Una vez que se han recuperado todos los argumentos, cada ciclo de VA_Start debe finalizarse con VA_END antes de que regrese la función variádica. De lo contrario, hay información sobre la pila con los datos de la llamada actual, lo que podría conducir a errores en la siguiente llamada de la función
Ya hemos visto cada una de las macros que forman parte de la recuperación de argumentos en una función variádica. Ahora, veamos un ejemplo de cómo usar el VA_ARG Macro para recuperar datos de los argumentos de entrada se implementa en este tipo de función.
Cómo crear una función variádica paso a paso y recuperar sus argumentos de entrada con el macro VA_ARG () en el idioma C
En este ejemplo, explicamos paso a paso cómo crear una función variádica y recuperar sus argumentos de entrada, utilizando la macro VA_ARG.
En el primer paso, creamos la función variádica, que llamaremos get_argumentos ().
Tanto la salida como el argumento de entrada declarado arg_1 serán de tipo doble. La declaración se verá así:
double get_arguments (doble arg_1, ...);Después de declarar la función con sus tipos de salida y entrada, continuamos con el desarrollo del cuerpo de la función.
En el siguiente paso, crearemos una matriz de 10 elementos de tipo doble con el nombre get_arg. En esta matriz, almacenaremos los datos del argumento de entrada, que recuperaremos con la macro VA_ARG.
También crearemos la variable "A", que es de tipo int y servirá como un identificador para los elementos de la matriz get_arg.
doble get_arg [10];En el siguiente paso, creamos un objeto de tipo VA_LIST, que llamaremos "AP".
Este objeto se inicializa con el Macro VA_Start y pasa como primer argumento, el nombre del objeto creado previamente 'AP'; y como segundo argumento el nombre de la última variable de entrada conocida, en este caso "Arg_1".
VA_LIST AP;Es importante tener en cuenta que el primer argumento, y en este caso el único conocido por la función, no está incluido en la lista "AP", por lo que su recuperación se realiza de la misma manera que para una función no variádica.
En este caso lo almacenamos en el elemento número 1 de la matriz get_arg.
get_arg [a] = r1;A continuación, cree un bucle de tiempo para recuperar los argumentos de entrada con la macro VA_ARG.
En este bucle, repita esto hasta que el macro VA_ARG obtenga el valor -1 o "E", que será el indicador del "último argumento".
En cada ciclo del bucle, el mensaje "Argumento recuperado:" se imprime mediante la función printf (), seguido del valor de los datos recuperados.
Entonces, el identificador "A" se incrementa en 1 y la macro VA_ARG se llama, que recupera el siguiente argumento de entrada y lo almacena en el elemento de matriz get_arg referenciado por "a".
while (get_arg [a] != E)Cuando se han recuperado todos los datos y el programa ha salido del bucle, debemos salir del objeto de lista "AP" que creamos al comienzo de la función con el Macro VA_END y pasar el nombre de este objeto como argumento de entrada.
VA_END (AP);A continuación, veremos el código completo para la función variádica que acabamos de crear, y el principal para llamar a la función y declarar las variables del tipo doble que enviaremos como argumentos de entrada.
#incluirLa imagen a continuación muestra la consola de comando con los argumentos de entrada recuperados. En este caso, se llamó a la función con dos argumentos de entrada.
Los datos recuperados para una llamada con cinco argumentos de entrada.
Problemas y soluciones para recuperar datos de entrada con el VA_ARG Macro
El principal problema que encontraremos en el desarrollo de una función variádica es que la macro VA_ARG no tiene método para informar al programador del final de la lista de argumentos de entrada. Entonces, una vez que se hayan recuperado todos los datos enviados en la llamada, esta macro devolverá resultados erróneos cada vez que se llame indefinidamente
Esto significa que no solo obtendrá resultados incorrectos, sino que en los casos en que la recuperación de datos esté en bucle, habrá un desbordamiento. Por lo tanto, el programador debe encontrar un método para detectar el final de los argumentos en la lista. Uno de los métodos puede ser usar una constante como el último argumento que indica el final de la lista.
Otro método es especificar como el primer argumento el número de parámetros que se enviarán cada vez que se llama a la función variádica.
Conclusión
En esta Lindirecta Artículo, le hemos dado una explicación detallada y completa de cómo funcionan las funciones variádicas y cómo usar el VA_ARG macro en el idioma C.
También explicamos en detalle el uso de las otras macros que forman parte de la recuperación de datos en este tipo de función y le mostramos paso a paso cómo declarar y desarrollar uno de ellos que es un recurso muy importante en este y otros lenguajes de programación. Puede encontrar más artículos como este en el motor de búsqueda de sugerencias de Linux.