Professional Documents
Culture Documents
Segn vamos haciendo programas de ordenador, nos damos cuenta que algunas partes
del cdigo se utilizan en muchos de ellos. Por ejemplo, podemos tener varios programas
que utilizan nmeros complejos y las funciones de suma, resta, etc son comunes.
Tambin es posible, por ejemplo, que nos guste hacer juegos, y nos damos cuenta que
estamos repitiendo una y otra vez el cdigo para mover una imagen (un marcianito o a
Lara Croft) por la pantalla.
Sera estupendo poder meter esas funciones en un directorio separado de los programas
concretos y tenerlas ya compiladas, de forma que podamos usarlas siempre que
queramos. Las ventajas enormes de esto son:
La forma de hacer esto es hacer libreras. Una librera son una o ms funciones que
tenemos ya compiladas y preparadas para ser utilizadas en cualquier programa que
hagamos. Hay que tener el suficiente ojo cuando las hacemos como para no meter
ninguna dependencia de algo concreto de nuestro programa.
return a-b;
}
Es un fichero con un par de funciones simples de suma() y resta().
Un detalle importante a tener en cuenta, son los #define del fichero de cabecera (.h). Al
hacer una librera, no sabemos en qu futuros programas la vamos a utilizar ni cmo
estarn organizados. Supongamos en un futuro programa que hay un fichero de
cabecera fichero1.h que hace #include del nuestro. Imaginemos que hay tambin un
fichero2.h que tambin hace #include del nuestro. Finalmente, con un pequeo
esfuerzo ms, imaginemos que hay un tercer fichero3.c que hace #include de
fichero1.h y fichero2.h, es decir, ms o menos lo siguiente:
fichero1.h
#include <libreria1.h>
...
fichero2.h
#include <libreria1.h>
...
fichero3.c
#include <fichero1.h>
#include <fichero2.h>
...
Cuando compilemos fichero3.c, dependiendo de lo que haya definido en libreria1.h,
obtendremos un error. El problema es que al incluir fichero1.h, se define todo lo que
haya en ese fichero, incluido lo de libreria1.h. Cuando se incluye fichero2.h, se vuelve
a intentar definir lo contenido en libreria1.h, y se obtiene un error de que esas
definiciones estn definidas dos veces.
La forma de evitar este problema, es meter todas las definiciones dentro de un bloque
#ifndef - #endif, con el nombre (_LIBRERIA_1_H en el ejemplo) que ms nos guste y
distinto para cada uno de nuestros ficheros de cabecera. Es habitual poner este nombre
precedido de _, acabado en _H y que coincida con el nombre del fichero de cabecera,
pero en maysculas.
Dentro del bloque #ifndef - #endif, hacemos un #define de ese nombre (no hace falta
darle ningn valor, basta con que est definido) y luego definimos todos nuestros tipos y
prototipos de funciones.
Cuando incluyamos este fichero por primera vez, _LIBRERIA_1_H no estar definido,
as que se entrar dentro del bloque #ifndef - #endif y se definirn todos los tipos y
prototipos de funciones, incluido el mismo _LIBRERIA_1_H. Cuando lo incluyamos
por segunda vez, _LIBRERIA_1_H ya estar definido (de la inclusin anterior), por lo
que no se entrar en el bloque #ifndef - #endif, y no se redefinir nada por segunda vez.
Es buena costumbre hacer esto con todos nuestros .h, independientemente de que sean o
no para libreras. Si te fijas en algn .h del sistema vers que tienes este tipo de cosas
hasta aburrir. Por ejemplo, en /usr/include/stdio.h, lo primero que hay despus de los
comentarios, es un #ifndef _STDIO_H.