IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Problème include interdépendant


Sujet :

C

  1. #1
    Membre averti
    Homme Profil pro
    etudiant info
    Inscrit en
    Mars 2016
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : etudiant info

    Informations forums :
    Inscription : Mars 2016
    Messages : 32
    Par défaut Problème include interdépendant
    Bonjour, après de nombreuses recherches je n'ai pas toujours compris comment pouvait-on régler le problème de l'interdépendance de fichiers en c.
    J'ai un fichier A dépendant d'un fichier B et un fichier B dépendant un fichier A. Si on met simplement des include des 2 côtés on a naturellement une boucle infinie.
    Si j'ai bien compris, la convention pour les headers et de mettre l'intégralité du code dans un #ifndef ... #endif de telle sorte que l'on s'assure qu'un header n'est lu qu'une seule fois.
    Cependant le problème n'a pas été résolu : le fichier A va être lu et va include le fichier B car il en a besoin, mais le fichier B ne pourra pas include le fichier A alors qu'il en a besoin (la condition ifndef pour le fichier A renvoie maintenant false).
    Merci d'avance pour votre aide.

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 491
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Sans doute as-tu un mauvais découpage. Si A a besoin de B et B a besoin de A, alors ton couplage est trop fort entre A et B qui (peut-être) finalement n'est que AB.

    Il est possible que tu puisses trouver une partie commune C. A a besoin de C, B a besoin de C mais A et B n'ont plus besoin l'un de l'autre.

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 442
    Par défaut
    Bonjour,

    Ceci est avant tout un problème de conception. Tu ne dois, en principe, pratiquement jamais te retrouver dans cette situation. Donc, il y a un travail à faire en amont, avant même d'écrire une ligne de code (enfin, dans le principe), pour éliminer la majorité de ces cas et les réduire à la portion congrue.

    Il reste quand même des cas, où, algorithmiquement, certains objets peuvent s'entre-référencer : on ne peut pas faire une structure A qui contienne une structure B qui, elle-même, contienne une structure A car l'instanciation-même d'une telle structure occuperait une mémoire infinie. Et, en réalité, il n'est pas non plus possible de déclarer une structure A qui s'auto-contienne (une struct A contenant un membre de type struct A). Le problème est le même. Par contre, il est tout-à-fait concevable qu'une structure A contienne un pointeur vers une structure B et qu'une structure B contienne un pointeur vers une structure A. Et à dire vrai, une structure A peut référencer à l'aide d'un pointeur une autre structure A. Il s'agit tout simplement là… d'une liste chaînée !

    Pour résoudre ce cas, il est possible de faire une déclaration partielle, c'est-à-dire indiquer que A est une structure sans définir tout de suite les membres de cette structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    struct A; /* Déclarations partielles */
    struct B;
     
    struct A {
        int            valeur;
        struct B        *reference;
    };
     
    struct B {
        int            valeur;
        struct A        *reference;
    };
    De là, dans chacun de tes fichiers *.h, dûment protégés par les gardes #ifndef que tu évoques, tu ne fais aucun #include (en tout cas, pas ceux qui concernent les objet de même « niveau »), tu ne déclares que ce qui est propre à l'objet concerné par *.h en question et, en fin de processus, tu n'y ajoutes que les déclarations partielles qui sont nécessaires à tes pointeurs.

Discussions similaires

  1. problème : problème include avec 2 Form (pitié !)
    Par antoile dans le forum VC++ .NET
    Réponses: 6
    Dernier message: 04/05/2007, 16h02
  2. Problème include
    Par djul94 dans le forum Langage
    Réponses: 10
    Dernier message: 26/03/2007, 13h49
  3. Problème includes pas conformes et incomplets
    Par souviron34 dans le forum Dev-C++
    Réponses: 6
    Dernier message: 30/01/2007, 20h57
  4. [VC++] Problème include de header
    Par Yellowmat dans le forum MFC
    Réponses: 10
    Dernier message: 08/12/2005, 13h50
  5. problème include avec win 2003 / IIS6
    Par fredoche dans le forum ASP
    Réponses: 3
    Dernier message: 26/09/2005, 17h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo