8 de noviembre de 2016

Bibliotecas personalizadas de funciones.

   El lenguaje de programación C incorpora muchas y muy útiles, además de variadas, funciones incluidas en sus diferentes bibliotecas pero además, a través de un mecanismo relativamente sencillo, es posible crear "bibliotecas" personalizadas de funciones, esto es, archivos que contengan funciones definidas por el programador y que puedan ser utilizadas en cualquier programa que las incluya, de manera similar a como se hace con las bibliotecas estándares del lenguaje.

   Estrictamente hablando, con el procedimiento que se describirá a continuación, no se estará creando ninguna biblioteca en el sentido más estricto del lenguaje de programación, sino que, haciendo uso del mecanismo de abstracción proporcionado por la directiva de inclusión de archivos #include, se proporciona al programador la sensación de incluir sus propias bibliotecas de funciones.

   En esta entrada se mostrará brevemente el procedimiento para crear bibliotecas personalizadas de funciones. La descripción se basará en el Ejemplo 4.2, por lo que se recomienda su revisión.

   El primer paso para crear una biblioteca personalizada de funciones, es tener las funciones definidas por el programador en un archivo nuevo e independiente. Dicho archivo debe contener al menos una función, mientras que el límite dependerá del espacio designado para el archivo en el disco que lo almacene, es decir: potencialmente ilimitado.

   Resulta sumamente conveniente crear bibliotecas personalizadas de funciones con funciones que tengan algún tipo de relación entre ellas, por lo que en realidad, la limitante en el número de funciones que pueda contener una biblioteca debería estar supeditada a la abstracción de los servicios que se espera proporcione dicha biblioteca.

   Las funciones mayor y menor del Ejemplo 4.2, se han colocado en un nuevo archivo tal y como se muestra en el Ejemplo 4.5. El nombre de archivo que contendrá la biblioteca personalizada de funciones no deberá contener espacios preferentemente, símbolos acentuados o compuestos como la letra ñ.

   Note que en esencia el Ejemplo 4.2 y el Ejemplo 4.5 son esencialmente iguales, la diferencia radica en la localización de las funciones que, para el caso de bibliotecas personalizadas, se encuentran en un archivo independiente con extensión “.h”.

   La línea 7 del Ejemplo 4.6 muestra la inclusión de la biblioteca personalizada de funciones del Ejemplo 4.5. Observe que en la directiva #include se han cambiado los corchetes angulares (< >) por comillas (“ ”) lo cual, además de diferenciar una biblioteca personalizada de funciones de una biblioteca del lenguaje, le indica al compilador que busque el archivo indicado entre comillas en la misma localidad (carpeta o directorio) que el archivo que incluye a dicha biblioteca.

   En resumen, tanto el archivo fuente que usará a la biblioteca personalizada de funciones como el archivo que contiene las funciones de biblioteca personalizada, deberán estar en el mismo directorio o carpeta. Cabe mencionar que es posible especificar una ruta para la localización de un archivo de biblioteca personalizada en particular, pero en general esto no es recomendable debido a que se sacrifica la portabilidad, ya que la especificación de rutas de archivos y directorios cambia de un sistema operativo a otro.

   Así como no hay un límite para el número de funciones que puede contener un archivo de biblioteca personalizada, se debe aclarar que tampoco hay un límite para el número de archivos de bibliotecas personalizadas que se pueden incluir dentro de un programa. Para el caso del Ejemplo 4.6, se han incluido una biblioteca del lenguaje (línea 6) y una biblioteca personalizada (línea 7), pero podrían ser un número arbitrario de cualquiera de ellas; la única recomendación en este sentido sería, incluir primero las bibliotecas del lenguaje, y después las bibliotecas personalizadas con las funciones definidas por el programador.

   Finalmente, note que si se proporcionan los mismos datos para el Ejemplo 4.2 y para el Ejemplo 4.6 se obtendrá la misma salida, como se muestra en la siguiente figura:

Una posible salida producida por los Ejemplos 4.2 y 4.6.