next up previous
Next: El sistema de dependencia Up: Linux para Programadores Previous: Programas con un solo

Programas multi-módulo

Es interesante poder reutilizar código ya desarrollado en nuevos programas para crear una biblioteca de funciones. Por ejemplo, sería interesante disponer de una versión testeada y compilada de nuestra función de inversión de cadenas y poderla utilizar cuando nos sea necesario, pero sin necesidad de incluir el código fuente de Reverse(). De esta forma nos ahorraremos espacio de disco y tiempo de compilación. La solución es trabajar con programas C multi-módulo. En estos, únicamente un fichero fuente contiene la función main() que es la función por la que comienzan a ejecutarse el resto de funciones que hemos usado en nuestro programa. Todas aquellas funciones que formen parte de la biblioteca deben de escribirse en ficheros separados del fichero que contenga el main(). Un fichero puede contener más de una función de biblioteca. En nuestro ejemplo, vamos a crear el fichero de biblioteca llamado Reverse.c que contendrá la función Reverse(). Este será compilado creándose un fichero Reverse.o que contiene código máquina pero que no es un fichero ejecutable. Este debe de ser link-ado junto con la compilación del fichero reverse.c que contiene el main(). Existe además un fichero llamado Reverse.h que debe de contener aquellas definiciones de funciones (prototipos de funciones) tipos y estructuras de datos que deben de ser conocidos para el uso de las bibliotecas. En nuestro ejemplo, se generan los siguientes ficheros:
1.
El fichero Reverse.h:



width 3pt
width .3pt415pt/*
        Reverse.h
        Fichero cabecera con el prototipo de la función Reverse().
*/
void reverse(           /* Invierte */
        char *,         /* la cadena de entrada */
        char *);        /* la cadena de salida */
width .3pt
depth .3pt width -3pt

2.
El fichero Reverse.c:



width 3pt
width .3pt415pt/*
        Reverse.c
        Fichero que contiene el código que de la función Reverse().
*/
#include <stdio.h>      /* Puesto que utilizamos NULL */
#include <string.h>     /* Para el uso de strlen() */
#include "Reverse.h"    /* La definición de la biblioteca (a efectos de
                           chequeo de tipos en la compilación) */
void Reverse(char *in, char *out)
{
        int i,j;                /* Un par de iteradores */
        int len=strlen(in);     /* Longitud de la cadena a invertir */
        /* Invertimos la cadena */
        for(j=len-1,i=0;j>=0;j-,i++) out[i]=in[j];
        /* NULL es el fin de cadena en C */
        out[len]=NULL;
}
width .3pt
depth .3pt width -3pt

3.
Y el fichero en el que usamos la biblioteca construida:



width 3pt
width .3pt415pt/*
        reverse.c
        Testea el uso de la función Reverse.
*/
#include <stdio.h>      /* Usamos el printf() */
#include "Reverse.h"    /* Prototipo de Reverse(). Necesario ! */
main()                          /* Cuerpo principal del programa */
{
        char str[100];          /* Buffer para realizar inversiones de cadenas */
        Reverse("Hola",str);    /* Invertimos la cadena 'Hola' */
        /*
           Presentamos en pantalla a través de la salida entandar el
           resultado de la inversión de la cadena 'Hola'
        */
        printf("Reverse (\"Hola\")=%s\n",str);
}
width .3pt
depth .3pt width -3pt

Para compilar nuestro programa deberemos de ejecutar:



width 3pt
width .3pt415ptdali: % gcc -c Reverse.c
dali: % ls -l Reverse.o
-rw-r-r-   1 vi       wheel         242 May 11 15:32 Reverse.o
dali: % gcc reverse.c Reverse.o -o reverse
width .3pt
depth .3pt width -3pt

Y para ejecutar el ejemplo:



width 3pt
width .3pt415ptdali: % reverse
Reverse ("Hola")=aloH
dali: %
width .3pt
depth .3pt width -3pt
El sistema de dependencia entre ficheros: make
next up previous
Next: El sistema de dependencia Up: Linux para Programadores Previous: Programas con un solo
Vicente González Ruiz
1998-07-13