Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Comment éviter le message d'erreur 'redefinition'

9 réponses
Avatar
Nicolas ROBERT
Bonjour,

Je développe une application avec différentes classes, dépendantes les une
des autres.
dans certaines classes, les attributs sont des objets d'une autre classe.
Je suis donc obligé d'inclure la ligne de code suivante:

#include "fichier.h de ma classe dont dépent l'attibut"

cette ligne me génère plusieurs erreurs de ce type:

error C2371: '_StructureCreee' :redefinition; different basic types

Je crois comprendre que certaines de mes structures, déclarées dans le
fichier.h que j'inclue, sont donc redéclarées. Comment éviter ce genre
d'erreur ?

Cdt
nicolas

9 réponses

Avatar
fredatwork
Rendre l'inclusion du fichier conditionnelle en ajoutant :

#ifndef FIC1_DEJA_INCLUS
#define FIC1_DEJA_INCLUS
#include "fic1.h"
#endif

dans chaque fichier où fic1.h est nécessaire.

"Nicolas ROBERT" a écrit dans le
message news: chn3ud$sd2$
Bonjour,

Je développe une application avec différentes classes, dépendantes les une
des autres.
dans certaines classes, les attributs sont des objets d'une autre classe.
Je suis donc obligé d'inclure la ligne de code suivante:

#include "fichier.h de ma classe dont dépent l'attibut"

cette ligne me génère plusieurs erreurs de ce type:

error C2371: '_StructureCreee' :redefinition; different basic types

Je crois comprendre que certaines de mes structures, déclarées dans le
fichier.h que j'inclue, sont donc redéclarées. Comment éviter ce genre
d'erreur ?

Cdt
nicolas




Avatar
Christophe de VIENNE
[snip]
Je crois comprendre que certaines de mes structures, déclarées dans le
fichier.h que j'inclue, sont donc redéclarées. Comment éviter ce genre
d'erreur ?


En protégeant tes entêtes de la double inclusion :

toto.h
------
#ifndef TOTO_H_
#define TOTO_H_

// définition de la classe Toto (par exemple)

#endif // TOTO_H_
// fin du fichier

A+

Christophe

--
Christophe de Vienne

Avatar
Matthieu Moy
"fredatwork" writes:

Rendre l'inclusion du fichier conditionnelle en ajoutant :

#ifndef FIC1_DEJA_INCLUS
#define FIC1_DEJA_INCLUS
#include "fic1.h"
#endif

dans chaque fichier où fic1.h est nécessaire.


Ou bien

#ifndef FIC1_DEJA_INCLUS
#define FIC1_DEJA_INCLUS

au début de fic1.h et

#endif

a la fin. (Plus simple à écrire, mais demande au préprocesseur de
parser fic1.h de toutes façons => ça compile un peu plus doucement)

--
Matthieu

Avatar
Christophe de VIENNE
Rendre l'inclusion du fichier conditionnelle en ajoutant :

#ifndef FIC1_DEJA_INCLUS
#define FIC1_DEJA_INCLUS
#include "fic1.h"
#endif

dans chaque fichier où fic1.h est nécessaire.


Et pourquoi pas directement dans fic1.h ? C'est quand même nettement
plus simple et maintenable.
Je dirais même plus, c'est une habitude à prendre.

A+

Christophe

--
Christophe de Vienne

Avatar
Nicolas ROBERT
Merci beaucoup.

Cdt
nicolas
Avatar
fredatwork
"Christophe de VIENNE" a écrit dans le message
news: newscache$h28q3i$dih$
Rendre l'inclusion du fichier conditionnelle en ajoutant :

#ifndef FIC1_DEJA_INCLUS
#define FIC1_DEJA_INCLUS
#include "fic1.h"
#endif

dans chaque fichier où fic1.h est nécessaire.


Et pourquoi pas directement dans fic1.h ? C'est quand même nettement
plus simple et maintenable.
Je dirais même plus, c'est une habitude à prendre.

A+

Christophe

--
Christophe de Vienne


Bien sûr !
J'ai répondu un peu vite ...


Avatar
Christophe de VIENNE
"fredatwork" writes:
Rendre l'inclusion du fichier conditionnelle en ajoutant :

#ifndef FIC1_DEJA_INCLUS
#define FIC1_DEJA_INCLUS
#include "fic1.h"
#endif

dans chaque fichier où fic1.h est nécessaire.



Ou bien

#ifndef FIC1_DEJA_INCLUS
#define FIC1_DEJA_INCLUS

au début de fic1.h et

#endif

a la fin. (Plus simple à écrire, mais demande au préprocesseur de
parser fic1.h de toutes façons => ça compile un peu plus doucement)


Le temps gagné en compilo compense-t-il le temps perdu à 1/ écrire à
protection systématiquement 2/ compiler pour se rendre compte qu'on l'a
oublié 3/ documenter fich1.h de manière à ce que nos collaborateurs
pensent eux aussi à la protection 4/ s'expliquer avec ses collaborateurs
5/ ...

J'en doute fort...

--
Christophe de Vienne


Avatar
Matthieu Moy
Christophe de VIENNE writes:

Le temps gagné en compilo compense-t-il le temps perdu à 1/ écrire à
protection systématiquement 2/ compiler pour se rendre compte qu'on
l'a oublié 3/ documenter fich1.h de manière à ce que nos
collaborateurs pensent eux aussi à la protection 4/ s'expliquer avec
ses collaborateurs 5/ ...

J'en doute fort...


Moi aussi. Mais sachant qu'il y a des défenseurs de la protection au
niveau du #include, et ayant peur que l'auteur du message auquel je
répondais en fasse partie, j'ai donné par avance le contre-argument
pour éviter de le froisser ;-)

--
Matthieu

Avatar
Loïc Joly
Matthieu Moy wrote:

Christophe de VIENNE writes:


Le temps gagné en compilo compense-t-il le temps perdu à 1/ écrire à
protection systématiquement 2/ compiler pour se rendre compte qu'on
l'a oublié 3/ documenter fich1.h de manière à ce que nos
collaborateurs pensent eux aussi à la protection 4/ s'expliquer avec
ses collaborateurs 5/ ...

J'en doute fort...



Moi aussi. Mais sachant qu'il y a des défenseurs de la protection au
niveau du #include, et ayant peur que l'auteur du message auquel je
répondais en fasse partie, j'ai donné par avance le contre-argument
pour éviter de le froisser ;-)


Certains préconisent les deux : Le interne pour que ça marche tout le
temps, l'externe pour que ça marche plus vite. Perso, je n'ai jamais essayé.

--
Loïc