Il faut que cette pratique soit généralisée pour qu'on commence à mieux voir ce qui se passe.
Et s'assurer de ne plus avoir d'inclusions cycliques.
Il faut que cette pratique soit généralisée pour qu'on commence à mieux voir ce qui se passe.
Et s'assurer de ne plus avoir d'inclusions cycliques.
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Le problème des inclusions cycliques, c'est qu'avec les gardes telles que tu les as définis, tu as toujours un header dont le contenu est défini avant l'autre.
Exemple:
Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 //A.h #ifndef H_A #define H_A //Avant B.h #include "B.h" //Apres B.h class CA { B* pb; }; #endifSi je compile un fichier qui inclut A.h (on va dire: a.cpp), le préprocesseur donnera un truc de ce genre:
Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 //B.h #ifndef H_B #define H_B //Avant A.h #include "A.h" //Apres A.h class CB { A* pa; }; #endif
Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 //A.h #define H_A //Avant B.h //B.h #define H_B //Avant A.h //A.h //Apres A.h class CB { CA *pa; //ERREUR: CA inconnu }; //Apres B.h class CA { CB *pb; };
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Avant d'avoir mis des gardes j'avais des
et l'erreur était présente.
Code : Sélectionner tout - Visualiser dans une fenêtre à part #pragma once
Ce qui m'amène à la question : y a-t-il une différence entre les 2 méthodes ?
À propos du problème tel que je te le montre? je ne crois pas.
Pour des trucs plus complexes, il peut y avoir une différence.
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Est ce que par hasard (enfin par malchance plutôt), tes gardes n'entreraient pas en conflit avec d'autres gardes (système, autre projet, librairie tierces, ...)
Raymond
Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi
CafuroCafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
e-verbeUn logiciel de conjugaison des verbes de la langue française.
Ma page personnelle sur DVP.
Bonsoir,
Si tu as vraiment besoin d'aide tu dois dévoiler une partie de ton code
1 ière le header qui contient la ligne de l'erreur (tout le header)
2 ième le header qui contient la déclaration de ta CNoteDlg (tout le header)
3 ième le cpp qui provoque l'erreur de compilation et qui inclut ces headers. ( juste la partie des includes)
En reprenant l'exemple de Medinoc, la solution contre les inclusions circulaires est la déclarations forward :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 //A.h #ifndef H_A #define H_A class B; class CA { B* pb; }; #end ifIl reste alors à inclure A.h et B.h dans les .cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 //B.h #ifndef H_B #define H_B class A; class CB { A* pa; }; #end if
A propos de la différence entre #pragma once et les #define..., il me semble que le problème viens du faite que #pragma once n'est pas compatible avec tous les compilateurs (http://en.wikipedia.org/wiki/Pragma_once).
J'ai réalisé les déclarations forward au niveau de la classe qui inclue CNoteDlg et le problème semble être résolu.
Merci à tous pour le soutien.
Partager