Archivos de Encabezado (Headers) - AlgoritmosyEstructurasDeDatos/Laboratorio_JSL GitHub Wiki
Como C es un lenguaje bastante básico, extendemos sus mecanismos a través del uso de bibliotecas o módulos externos que incluimos mediante la instrucción de preprocesador #include, la que toma dos formas:
// Esto busca el archivo de encabezado en las ubicaciones estándar del compilador
#include <header1.h>
// Esto busca el archivo de encabezado en el directorio actual
#include "header2.h"Lo que hace la directiva #include es, donde se encuentra, reemplazarse durante el preprocesamiento por el contenido del encabezado solicitado, de modo que se incluyan todas las declaraciones que se realizan en él, para poder incluirlas en el código a compilar.
Especialmente cuando definimos nuestras propias estructuras, funciones sobre estas y demás operaciones de interés, resulta necesarios volverlas "llamables" desde más de un lugar, por lo que es buena idea poner sus declaraciones (como definiciones de tipos nuevos y prototipos de funciones) como parte de un archivo de encabezado que incluir desde el programa que los fuera a utilizar
Para crear nuestro propio header, tenemos que tener cuidado con algunos detalles. Es común que el mismo header sea incluido en más de un código fuente o incluso dentro de varios headers, por lo que resulta frecuente incluirlos varias veces. Normalmente esto no sería un problema, pero como C no maneja el concepto de espacios de nombres o sobrecarga de operadores, declarar varias veces la misma cosa puede producir problemas en tiempo de compilación. Es por esta razón que los headers suelen tener una estructura bastante común:
/* Parte el encabezado con la documentación,
* licencia o información de autores, en general,
* cualquier cosa que nos ayude a identificarlo
* como personas que leerán el código.
*/
#ifndef STRING_IDENTIFICADOR_H_
#define STRING_IDENTIFICADOR_H_
/* Aquí van todas nuestras declaraciones y código a
* incluir con el encabezado, como por ejemplo,
* una declaración de tipo
*/
typedef unsigned int ex_type;
// O prototipos de funciones
void dummy_function(int*, double*, char);
#endifLas directivas de preprocesador que se incluyen permiten a este ocultar el contenido entre ifndef y endif del compilador, si es que ya ha sido incluido a lo menos una vez: la instrucción #define define STRING_IDENTIFICADOR_H_ (normalmente este string es el nombre del header en mayúscula y con los puntos reemplazados por guiones bajos) y, si ya fue definida, pasa de largo.
Con esto, entonces, podemos crear nuestros encabezados con declaraciones sin miedo de que estas estén en conflicto con nuevas importaciones del mismo encabezado en otros sitios del código.