Encabezados que se incluyen entre sí en C
En C, ocasionalmente es necesario que los encabezados se incluyan entre sí. Sin embargo, esto puede generar problemas, especialmente cuando se trata de dónde colocar las declaraciones #include.
Macros internas o externas
En general, las declaraciones #include deben colocarse dentro de macros, como #ifndef include guards. Esto evita la recursividad infinita durante la compilación, como se demuestra en el siguiente ejemplo:
// A.h
#ifndef A_H_
#define A_H_
#include "B.h"
class A {
private:
B b;
public:
A() : b(*this) {}
};
#endif // A_H_
// B.h
#ifndef B_H_
#define B_H_
#include "A.h"
class B {
private:
A& a;
public:
B(A& a) : a(a) {}
};
#endif // B_H_
Colocar las declaraciones #include fuera de las macros da como resultado que el compilador recurra indefinidamente debido a la inclusión mutua entre A.h y B.h.
Tipos no declarados
Sin embargo, colocar las declaraciones #include dentro de las macros puede generar problemas con tipos no declarados. Por ejemplo, considere el siguiente código:
// A.h
#ifndef A_H_
#define A_H_
class A; // Forward declaration
#include "B.h"
class A {
private:
B b;
public:
A() : b(*this) {}
};
#endif // A_H_
// B.h
#ifndef B_H_
#define B_H_
#include "A.h"
class B {
private:
A a; // Directly include A
public:
B(A& a) : a(a) {}
};
#endif // B_H_
En este caso, el compilador se quejará de que A es un tipo no declarado dentro de B.h. Esto se debe a que la declaración directa en A.h no es visible cuando se incluye B.h.
Solución: declaraciones directas
Para resolver estos problemas, es mejor utilizar declaraciones directas e incluya el encabezado que contiene la definición completa cuando sea necesario. En este ejemplo, se debe agregar una declaración directa de A a B.h antes de la definición de B:
// B.h
#ifndef B_H_
#define B_H_
class A; // Forward declaration
#include "A.h"
class B {
private:
A a; // Directly include A
public:
B(A& a) : a(a) {}
};
#endif // B_H_
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3