0

Estoy programando en C++ con el IDE Code::Blocks entonces cuando uso el asistente de creación de un archivo para crear una Biblioteca (Llibreria) y la creo con el nombre "Biblioteca.h" automàticament se crea con las siguientes líneas en el fichero:

#ifndef BIBLIOTECA_H_INCLUDED
#define BIBLIOTECA_H_INCLUDED



#endif // BIBLIOTECA_H_INCLUDED

Entonces no se que importancia tienen esas líneas según lo que logro comprender se verifica si la macro BIBLIOTECA_H_INCLUDED no está definida y si no esta definida se define.

Yo en mi desconocimiento la suelo borrar y el programa me compila con normalidad, pero siempre me pregunto si el IDE escribió esas líneas es porque son necesarias pero el código compila entonces no se si deba borrarlas o no.

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
Josqui00
  • 29
  • 4

2 Answers2

1

El uso de esas directivas de procesador reciben el nombre de Header Guards, Include Guards, Macro Guards o File Guards.

Se hace uso de este tipo de construcciones para evitar cargar más de una vez una librería o header u otro motivo similar.

Referencias: Wikipedia

Mateo
  • 2,699
  • 1
  • 5
  • 19
1

Yo en mi desconocimiento la suelo borrar y el programa me compila con normalidad, pero siempre me pregunto si el IDE escribió esas líneas es porque son necesarias pero el código compila entonces no se si deba borrarlas o no.

Imagina que compras un coche y en el concesionario te dan las llaves de tu nuevo flagrante vehículo, te dicen "Usa estas llaves para cerrar el vehículo cuando lo estaciones" pero tu ves que el coche funciona igual tanto si lo cierras al estacionarlo como si lo dejas abierto.

Así que nunca cierras tu coche, y durante un tiempo todo va perfectamente hasta que un día ¡te lo roban!.


En el sistema de inclusiones funciona como un simple copia-pega de los archivos mencionados en las directivas de inclusión (#include), puedes ver más detalles en este hilo así que vamos a suponer que tienes un archivo Biblioteca.h que define el tipo Biblioteca:

Biblioteca.h
struct Biblioteca
{
};

Cuando este archivo es incluido es incluido en otro:

main.cpp
#include "Biblioteca.h"

int main()
{
    Biblioteca biblioteca;
    return 0;
}

Se genera este archivo para ser compilado:

struct Biblioteca // Proviene de #include "Biblioteca.h" en main.cpp
{
};

int main()
{
    Biblioteca biblioteca;
    return 0;
}

Ahora, supongamos que tienes otro archivo que usa tu objeto Biblioteca:

Alejandria.h
#include "Biblioteca.h"

struct Alejandria
{
    Biblioteca b;
};

Y lo incluyes también en main.cpp:

main.cpp
#include "Biblioteca.h"
#include "Alejandria.h"

int main()
{
    Biblioteca biblioteca;
    Alejandria alejandria;
    retorn 0;
}

Se genera este archivo para ser compilado:

struct Biblioteca // Proviene de #include "Biblioteca.h" en main.cpp
{
};
struct Biblioteca // Proviene de #include "Biblioteca.h" en Alejandria.h
{
};

struct Alejandria
{
    Biblioteca b;
};

int main()
{
    Biblioteca biblioteca;
    Alejandria alejandria;

    return 0;
}

El cuál no compilará, porque no puedes definir dos veces el mismo objeto. Por eso se añaden las "Líneas misteriosas", que evitarían incluir de nuevo un archivo que ya ha sido incluido.

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82