incluir guardias en C++

Mientras programamos en C++ , a menudo usamos una clase varias veces y, por lo tanto, requiere crear un archivo de encabezado e incluirlo en el programa principal. Ahora, a veces sucede que un determinado archivo de encabezado se incluye directa o indirectamente varias veces, luego la clase declarada en el archivo de encabezado se vuelve a declarar, lo que genera un error . Para comprender las necesidades de incluir guardias , primero entendamos un ejemplo:

Programa 1: Crear una clase Animal y guardarla como “ Animal.h” . A continuación se muestra el programa para el mismo:

C++

// C++ program to create a header
// file named as "Animal.h"
#include <iostream>
#include <string>
using namespace std;
  
// Animal Class
class Animal {
    string name, color, type;
  
public:
    // Function to take input
    void input()
    {
        name = "Dog";
        color = "White";
    }
  
    // Function to display the member
    // variables
    void display()
    {
        cout << name << " is of "
             << color << endl;
    }
};

Programa 2: Crear una clase Dog y guardarla como Dog.h . Recuerde incluir el archivo de encabezado » Animal.h» declarado anteriormente:

C++

// C++ program to create header file
// named as Dog.h
  
// Include the header file "Animal.h"
#include "Animal.h"
  
// Dog Class
class Dog {
    Animal d;
  
public:
    // Take input to member variable
    // using function call in another
    // header file
    void dog_input() { d.input(); }
  
    // Function to display the member
    // variable using function call
    // in another header file
    void dog_display() { d.display(); }
};

Programa 3: Cree un archivo main.cpp e incluya encima de ambos archivos de encabezado. A continuación se muestra el programa para el mismo:

C++

// C++ program to illustrate the
// include guards
#include "Animal.h"
#include "Dog.h"
#include <iostream>
using namespace std;
  
// Driver Code
int main()
{
    // Object of Dog class in
    // "Dog.h" header file
    Dog a;
  
    // Member Function Call
    a.dog_input();
    a.dog_display();
  
    return 0;
}

Salida: ahora, cuando se ejecuta el programa anterior «main.cpp» , se produce el siguiente error:

Explicación: cuando el programa «main.cpp» se compila utilizando include Animal.h y define la clase Animal, a partir de entonces, mientras se incluye Dog.h , Animal.h se incluye y en el programa principal hay dos definiciones de Animal Class , por eso este error es generado. Ahora resolvamos el problema usando include guards .

En los lenguajes de programación C y C++, una protección #include, a veces denominada protección de macro, protección de encabezado o protección de archivos, es una construcción particular que se usa para evitar el problema de la inclusión doble cuando se trata de la directiva de inclusión.

Solución:
Incluir guardias asegura que el compilador procesará este archivo solo una vez, sin importar cuántas veces se incluya. Los protectores de inclusión son solo una serie de directivas de preprocesador que garantizan que el archivo solo se incluirá una vez.
Preprocesadores utilizados:

  • #ifndef: si no está definido, determina si las macros proporcionadas no existen.
  • #define: Define las macros.
  • #endif: Cierra la directiva #ifndef .

El bloque de sentencias entre #ifndef y #endif se ejecutará solo si no se define la macro o el identificador con #ifndef .

Sintaxis:
 

#ifndef ANIMAL(Any word you like but unique to program)
#define ANIMAL(same word as used earlier)

class Animal {
    // Code
};

#endif

Por lo tanto, el archivo de encabezado «Animal.h» debe declararse como:

C++

// Checks if _ANIMALS IF DECLARED
#ifndef _ANIMALS_
  
// Defines _ANIMALS_ if above
// conditions fails
#define _ANIMALS_
  
#include <iostream>
#include <string>
using namespace std;
  
// Animal Class
class Animal {
    string name, color, type;
  
public:
    // Function to take input to
    // member variable
    void input()
    {
        name = "Dog";
        color = "White";
    }
  
    // Function to display the
    // member variable
    void display()
    {
        cout << name << " is of"
             << color << endl;
    }
};
#endif // _ANIMALS_

Producción:

Explicación: cuando se ejecuta main.cpp , se incluye Animal.h y se declara la clase animal. Aquí, la primera línea del encabezado Animal.h mientras se ejecuta y como _ANIMALS_ no está definido, el código se ejecuta normalmente. Cuando se incluye el archivo de encabezado Dog.h , que a su vez incluía Animal.h , esta vez _ANIMALS_ se define en el programa, por lo que la condición #ifndef de la primera línea es verdadera y el código completo se OLVIDA hasta la última línea, es decir, #endif . En palabras simples, si el preprocesador tiene ese nombre definido, omite el archivo completo y va a #endif , en otras palabras, no procesa el archivo.

Publicación traducida automáticamente

Artículo escrito por shripadbhat y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *