OVH Cloud OVH Cloud

[Includes] Des erreurs bizarres

10 réponses
Avatar
TigrouMeow
Bonsoir,

J'hésitais à poser cette question dans le newsgroup C++ mais
finalement je me dis que ça a peut-être un rapport avec Windows,
les MFC et ses fabuleuses macro et tout ce tralala.

En fait j'ai une application MFC, et avec 12 fichiers .cpp et 12
autres fichiers .h. Pour mes fichiers includes, j'utilise des
#ifndef ..
#define
...
#endif

(J'ai pas confiance aux #use de windows, j'avais déjà eu des
problèmes à cause de ça, enfin ici j'ai testé avec et le problème
est exactement le même).

Voilà, maintenant j'ai besoin de rajouter un include dans un .cpp
(qui se trouve déjà ailleurs dans mon projet, qui est déjà inclus et
aucun problème).

Là, c'est le drame, voilà les erreurs de compilation que j'obtiens alors
qu'avant (sans cet include) j'en ai aucune :

- ResultView.h(13): error C2143: erreur de syntaxe : absence de ';' avant
'*'
- CRootView' : Spécificateurs de type ou de classe de stockage manquants
- ResultView.h(13): error C2501: 'CResultView::wRoot' : Spécificateurs de
type ou de classe de stockage manquants

Ce qui est étonnant c'est que ces erreurs se trouvent alors dans le fichier
.h
que j'ai justement inclus. Comme je l'ai déjà dis, ce fichier est déjà
inclus
dans d'autres fichiers et jamais il n'avait eu cet effet là.

Vous avez des idées ? Si vous voulez je peux vous envoyer mon code (mais
pas le poster, c'est beaucoup trop gros).

Merci :)

--
Meow ;o)

10 réponses

Avatar
Nico
> Voilà, maintenant j'ai besoin de rajouter un include dans un .cpp
(qui se trouve déjà ailleurs dans mon projet, qui est déjà inclus et
aucun problème).

Là, c'est le drame, voilà les erreurs de compilation que j'obtiens alors
qu'avant (sans cet include) j'en ai aucune :

- ResultView.h(13): error C2143: erreur de syntaxe : absence de ';' avant
'*'
- CRootView' : Spécificateurs de type ou de classe de stockage manquants
- ResultView.h(13): error C2501: 'CResultView::wRoot' : Spécificateurs de
type ou de classe de stockage manquants

Ce qui est étonnant c'est que ces erreurs se trouvent alors dans le


fichier
.h
que j'ai justement inclus. Comme je l'ai déjà dis, ce fichier est déjà
inclus
dans d'autres fichiers et jamais il n'avait eu cet effet là.

Vous avez des idées ? Si vous voulez je peux vous envoyer mon code (mais
pas le poster, c'est beaucoup trop gros).



Quelques idées :
- soit ton .h est pas autonome. C'est facile à tester, tu crées un .cpp avec
juste l'include et il doit compiler.
- soit tu as des dépendances circulaires entre tes .h et çà se passe bien ou
mal suivant quel .h est inclus en premier. Pour tester, un peu pareil, tu
crées un .cpp avec juste un des include et puis tu essayes tous les cas de
figure.

J'espère que çà t'aide.
Avatar
TigrouMeow
"Nico" a écrit dans le message de news:
42598a6e$0$15279$

Voilà, maintenant j'ai besoin de rajouter un include dans un .cpp
(qui se trouve déjà ailleurs dans mon projet, qui est déjà inclus et
aucun problème).

Là, c'est le drame, voilà les erreurs de compilation que j'obtiens alors
qu'avant (sans cet include) j'en ai aucune :

- ResultView.h(13): error C2143: erreur de syntaxe : absence de ';' avant
'*'
- CRootView' : Spécificateurs de type ou de classe de stockage manquants
- ResultView.h(13): error C2501: 'CResultView::wRoot' : Spécificateurs de
type ou de classe de stockage manquants

Ce qui est étonnant c'est que ces erreurs se trouvent alors dans le


fichier
.h
que j'ai justement inclus. Comme je l'ai déjà dis, ce fichier est déjà
inclus
dans d'autres fichiers et jamais il n'avait eu cet effet là.

Vous avez des idées ? Si vous voulez je peux vous envoyer mon code (mais
pas le poster, c'est beaucoup trop gros).



Quelques idées :
- soit ton .h est pas autonome. C'est facile à tester, tu crées un .cpp
avec
juste l'include et il doit compiler.
- soit tu as des dépendances circulaires entre tes .h et çà se passe bien
ou
mal suivant quel .h est inclus en premier. Pour tester, un peu pareil, tu
crées un .cpp avec juste un des include et puis tu essayes tous les cas de
figure.

J'espère que çà t'aide.



En fait je suis sur que c'est ce problème de "dépendance circulaire", car
mes fichiers indépendamment compilent sans problème.
Par contre pour résoudre ça, c'est vraiment costaud... j'aurais peut etre
du mieux pensé mon truc dès le départ.
Avatar
Patrick Philippot
TigrouMeow wrote:
En fait je suis sur que c'est ce problème de "dépendance circulaire",
car mes fichiers indépendamment compilent sans problème.
Par contre pour résoudre ça, c'est vraiment costaud... j'aurais peut
etre du mieux pensé mon truc dès le départ.



Dans ce cas, procédez à un découpage de vos fichiers .h en unités
indépendantes (qui compilent de manière autonome comme l'explique Nico).

Ou bien sortez les fichiers .h qui sont eux-mêmes inclus par ce/ces
fichier(s) include et faites le #include à un autre niveau du code.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Jacky Goyon
"TigrouMeow" a écrit dans le message de
news: 42599663$0$6750$
"Nico" a écrit dans le message de news:
42598a6e$0$15279$
>
>> Voilà, maintenant j'ai besoin de rajouter un include dans un .cpp
>> (qui se trouve déjà ailleurs dans mon projet, qui est déjà inclus et
>> aucun problème).
>>
>> Là, c'est le drame, voilà les erreurs de compilation que j'obtiens


alors
>> qu'avant (sans cet include) j'en ai aucune :
>> Vous avez des idées ? Si vous voulez je peux vous envoyer mon code


(mais
>> pas le poster, c'est beaucoup trop gros).
>


idée 1
reconstruit tout : commande rebuild all
idée 2
dans les settings de ton projet, onglet C/C++, category precompiled headers
coche not using...

Jacky
Avatar
TigrouMeow
"Patrick Philippot" a écrit dans le
message de news: d3d6go$2lcc$
TigrouMeow wrote:
En fait je suis sur que c'est ce problème de "dépendance circulaire",
car mes fichiers indépendamment compilent sans problème.
Par contre pour résoudre ça, c'est vraiment costaud... j'aurais peut
etre du mieux pensé mon truc dès le départ.



Dans ce cas, procédez à un découpage de vos fichiers .h en unités
indépendantes (qui compilent de manière autonome comme l'explique Nico).

Ou bien sortez les fichiers .h qui sont eux-mêmes inclus par ce/ces
fichier(s) include et faites le #include à un autre niveau du code.



Alors en fait le problème c'est que j'ai une classe A qui contient un
objet de type classe B et dans ma classe B j'ai un objet de type
classe A.

Ce que je demande est peut-être impossible ?
Avatar
Dominique Vaufreydaz
Bonjour,

Alors en fait le problème c'est que j'ai une classe A qui contient un
objet de type classe B et dans ma classe B j'ai un objet de type
classe A.



Avant la declaration de classe A, tu ecris :
class B;

class A :
{
};


Et reciproquement pour ta classe B.

Doms.
Avatar
Alexandre
> Alors en fait le problème c'est que j'ai une classe A qui contient un
objet de type classe B et dans ma classe B j'ai un objet de type
classe A.



c'est impossible si B contient un A et A contient un B, l'une des 2 classes
devant bien être déclarée avant l'autre...
Par contre c'est possible si B contient un A* ou si A contient un B*,
puisque le compilateur n'a pas besoin de la déclaration complète de la
classe dans le cas d'un membre pointeur :

// fichier A.h
class B; // déclaration "en avant", juste pour dire au compilo que B
existe et qu'elle est une classe

class A
{
B* membreB;
...
};

// fichier B.h
#include "A.h"
class B
{
A membreA;
...};

par exemple...
Voir sur fr.comp.lang.c++ pour + de détails sur les dépendances circulaires
(souvent dues à une erreur de conception)


Ce que je demande est peut-être impossible ?




Avatar
TigrouMeow
"Dominique Vaufreydaz" a écrit dans le
message de news: d3e079$qck$
Bonjour,

Alors en fait le problème c'est que j'ai une classe A qui contient un
objet de type classe B et dans ma classe B j'ai un objet de type
classe A.



Avant la declaration de classe A, tu ecris :
class B;

class A :
{
};


Et reciproquement pour ta classe B.



En fait j'ai essayé d'épurer au maximum tous mes fichiers au niveau
des includes, et maintenant je PEUX faire mon include sans qu'il me
sorte des erreurs.
Par contre, dès que je déclare mon objet dans la classe, c'est LA
qu'il me sort à nouveau des erreurs et elles n'ont pas beaucoup de
rapport, les voici :

- RootView.h(10): error C2143: erreur de syntaxe : absence de ';' avant '*'
- error C2501: 'CRootView::CResultView' : Spécificateurs de type ou de
classe de stockage manquants
- error C2501: 'CRootView::wResult' : Spécificateurs de type ou de classe de
stockage manquants

Tout ça à cause de la déclaration d'un objet dans une classe... evidemment
des classes de cet objet sont déjà ailleurs, et il y a aucun problème, donc
à mon avis c'est toujours un problèmes liés aux includes et ce genre de
choses, mais à savoir comment résoudre le problème je sais plus trop là...

Je suis un abonné aux problèmes en ce moment décidément ;)
Avatar
TigrouMeow
"Alexandre" a écrit dans le message de news:
425a9bdc$0$7517$

Alors en fait le problème c'est que j'ai une classe A qui contient un
objet de type classe B et dans ma classe B j'ai un objet de type
classe A.



c'est impossible si B contient un A et A contient un B, l'une des 2
classes devant bien être déclarée avant l'autre...
Par contre c'est possible si B contient un A* ou si A contient un B*,
puisque le compilateur n'a pas besoin de la déclaration complète de la
classe dans le cas d'un membre pointeur :

// fichier A.h
class B; // déclaration "en avant", juste pour dire au compilo que B
existe et qu'elle est une classe

class A
{
B* membreB;
...
};

// fichier B.h
#include "A.h"
class B
{
A membreA;
...};

par exemple...
Voir sur fr.comp.lang.c++ pour + de détails sur les dépendances
circulaires (souvent dues à une erreur de conception)



En effet c'est la bonne solution, de cette manière j'arrive à contourner
le problème ! Bon à chaque fois que je compile j'ai une petite peur donc
ça se trouve je reviendrai en pleurant une nouvelle fois mais bon je croise
les doigts :)

Merci !
Avatar
Alexandre
> En effet c'est la bonne solution, de cette manière j'arrive à contourner
le problème ! Bon à chaque fois que je compile j'ai une petite peur donc
ça se trouve je reviendrai en pleurant une nouvelle fois mais bon je
croise
les doigts :)

Merci !



bonne chance !