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.
Version imprimable
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.
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:
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; }; #endif
Si je compile un fichier qui inclut A.h (on va dire: a.cpp), le préprocesseur donnera un truc de ce genre:Code:
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:
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; };
Avant d'avoir mis des gardes j'avais des
et l'erreur était présente.Code:#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.
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, ...)
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:
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 if
Il reste alors à inclure A.h et B.h dans les .cppCode:
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. :yaisse2:
Merci à tous pour le soutien.