Bienvenidos sean a este post, hoy revisitaremos los archivos de encabezado.
Si bien en este post hablamos sobre los archivos de encabezado lo hicimos de una forma muy basica donde simplemente creabamos un archivo de encabezado con la extension .h donde definiamos todo lo necesario, pero en la vida real se utiliza mas como lo vimos en este otro post donde en el archivo con la extension .h definiremos los struct necesarios asi como los ptototipos de las funciones pero en otro archivo con el mismo nombre pero con la extension .c definiremos a los prototipos antes declarados, y en el codigo final solo incluiremos al archivo de encabezado, para entenderlo mejor vamos a crear un pequeño ejemplo, para ello les recomiendo primero crear un nuevo directorio con el nombre de header y dentro crearemos otro directorio con el nombre de libs, la estructura deberia ser algo asi:
header/
└── libs
Nuestro primer paso sera crear un archivo dentro del directorio libs con el nombre de libreria.h y le agregaremos el siguiente codigo:
libreria.h
typedef enum Mamifero
{
Perro,
Gato
} Mamifero;
typedef struct Animal
{
Mamifero mamifero;
int edad;
int peso;
} Animal;
En este caso definiremos dos elementos para crear nuestro animales, el primero sera de tipo enum para generar dos constantes que representaran a que mamifero, en el segundo caso tendremos un struct donde almacenaremos tres datos, uno del tipo de mamifero y dos datos de este, nuestro siguiente paso sera crear otro archivo dentro del directorio libs con el nombre de funciones.h y le agregaremos el siguiente codigo:
funciones.h
#include <stdio.h>
#include "libreria.h"
void mostrar_datos(Animal a);
void hablar(Animal a);
Aqui tendremos los prototipos de las funciones que usaremos en nuestro programa, observen que al comienzo llamamos a las dos librerias que necesitaremos, en este caso la estandar de siempre y la que creamos anteriormente, recuerden que la libreria o archivo de encabezado entre estos simbolos <> significa que se encuentra en el directorio include de los tipos Unix o en el path del sistema para los basados en Windows/DOS, y la que este entre comillas dobles («) significa que estara en otro directorio, en este caso incluimos a nuestra libreria porque la necesitaremos para los argumentos de nuestras funciones, ahora pasemos a definirlas y para ello en el directorio libs crearemos otro archivo con el nombre funciones.c y le agregaremos el siguiente codigo:
funciones.c
#include "funciones.h"
void mostrar_datos(Animal a)
{
printf("Tipo: %s\nPeso: %i\nEdad: %i\n",
a.mamifero == 0 ? "Perro" : "Gato",
a.peso,
a.edad);
}
void hablar(Animal a)
{
switch(a.mamifero)
{
case 0:
printf("Guau!!!\n");
break;
case 1:
printf("Miau!!!\n");
break;
}
}
Observen que lo primero que hacemos es incluir al archivo de encabezado, esto no solo incluira los prototipos anteriores sino que tambien nos permitira acceder a las librerias que incluimos en este archivo, ahora simplemente definimos a las funciones, hablemos sobre la primera, en este caso simplemente mostraremos los datos que se encuentren cargados en el objeto que se genero en base al struct Animal, tenemos un operador condicional donde vertificamos si es un Perro o un Gato para indicarlo en pantalla y luego los datos que contenga, el siguiente sera indicar que sonido hara el animal en cuestion, en base al valor de mamifero y un switch donde mostraremos un valor u otro, ya tenemos nuestras funciones definidas ahora pasemos al programa en si, para ello en el directorio headers crearemos un nuevo archivo con el nombre de program.c y le agregaremos el siguiente codigo:
program.c
#include "libs/funciones.h"
int main()
{
Animal animal_1 = {Perro, 8, 25};
Animal animal_2 = {Gato, 12, 5};
mostrar_datos(animal_1);
printf("anima1_1 dice ");
hablar(animal_1);
mostrar_datos(animal_2);
printf("animal_2 dice ");
hablar(animal_2);
return 0;
}
Observen que solo necesitamos llamar al archivo de encabezado donde ya incluimos los archivos/librerias necesarias, porque despue en el main pudimos crear dos objetos del tipo Animal con sus respectivos datos, una vez definidos mostraremos los datos del primer animal, luego mostramos un mensaje para luego llamar a la segunda funcion, lo mismo hacemos con el segundo animal, con todo esto comentado solo nos resta compilarlo para probarlo pero antes vamos a ver como debe ser la estructura de los directorios y archivos:
header/
├── libs
│ ├── funciones.c
│ ├── funciones.h
│ └── libreria.h
└── program.c
Ahora si podemos a compilarlo pero para ello debemos hacerlo de la siguiente manera:
$ gcc libs/funciones.c program.c -o program
Observen que pasamos los archivos con la extension .c y no los de .h, si hay mas librerias debemos pasarlas tambien pero si existen mas de una podemos usar el siguiente comodin:
$ gcc libs/*.c program.c -o program
Y este automaticamente tomara todos los archivos en ese directorio, con el programa compilado pasemos a ver como es su salida:
tinchicus@dbn001vrt:~/lenguajes/C/header$ ./program
Tipo: Perro
Peso: 25
Edad: 8
anima1_1 dice Guau!!!
Tipo: Gato
Peso: 5
Edad: 12
animal_2 dice Miau!!!
tinchicus@dbn001vrt:~/lenguajes/C/header$
Como pueden ver trabajo de la forma que le indicamos, esta es la forma mas correcta de trabajar con nuestros codigos, esto nos facilitara a la hora de trabajar con nuestros errores porque podemos tener mas centralizada las distintas partes del programa y saber que un error deberia estar en un sector particular y no tener que revisar un archivo que puede contener miles o cientos de miles de linea.
En resumen, hoy hemos repasado archivos de encabezado, como se utiliza realmente, hemos vuelto hacer el codigo que vimos en este post, al cual ahora lo separamos en dos archivos, hemos agregado una nueva funcion, tambien hemos visto como se debe compilar cuando trabajamos con este tipo de archivos, espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donación
Es para mantenimento del sitio, gracias!
$1.50
