Maison > développement back-end > C++ > Comment les gardes inclus ne parviennent-ils pas à empêcher les dépendances circulaires en C ?

Comment les gardes inclus ne parviennent-ils pas à empêcher les dépendances circulaires en C ?

DDD
Libérer: 2024-12-31 21:55:09
original
995 Les gens l'ont consulté

How Do Include Guards Fail to Prevent Circular Dependencies in C  ?

Inclure les gardes et les dépendances circulaires en C

Votre problème découle des dépendances circulaires #include dans votre code. Dans votre configuration, Physics.h inclut GameObject.h et GameObject.h doit inclure Physics.h pour accéder à la classe Physics.

Comment les préprocesseurs gèrent #include

Les préprocesseurs traitent les instructions #include en copiant physiquement le contenu du fichier inclus dans le fichier actuel. Dans votre cas :

  • inclure "Physics.h" dans GameObject.h copie le contenu de Physics.h dans GameObject.h.

  • Inside Physics. h, #include "GameObject.h" tente ensuite d'inclure le contenu copié de GameObject encore une fois.

Pourquoi l'inclusion des gardes échoue

Les gardes d'inclusion ne sont pas efficaces pour empêcher les dépendances circulaires. Considérez le code suivant :

// Physics.h
#ifndef PHYSICS_H
#define PHYSICS_H
#include "GameObject.h"
#endif
Copier après la connexion

Lorsque le préprocesseur traite ce code, GameObject.h est copié dans Physics.h. Cependant, le préprocesseur ne connaît pas la référence circulaire et exécute la ligne #include dans le contenu copié de GameObject, qui tente d'inclure Physics.h (déjà inclus). Cela conduit à une erreur de compilation.

Résolution des dépendances circulaires

Pour résoudre les dépendances circulaires, des déclarations directes peuvent être utilisées. Dans votre cas :

Physics.h

class Physics;  // Forward declaration

class GameObject {
    // ...
    Physics* physics;  // Pointer to Physics object
    // ...
};
Copier après la connexion

GameObject.h

#include "Physics.h"

class GameObject {
    // ...
    Physics physics;  // Actual object declaration
    // ...
};
Copier après la connexion

En utilisant un forward déclaration dans Physics.h et en déclarant l'objet réel dans GameObject.h, le compilateur peut séparer la définition de ces classes. Il peut d'abord traiter la déclaration directe dans Physics.h, puis traiter la définition réelle de l'objet dans GameObject.h, évitant ainsi tout problème de circularité.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal