Même structure dans plusieurs fichiers en C

Résolu/Fermé
sonia - 30 avril 2009 à 21:27
 sonia - 1 mai 2009 à 11:09
Bonjour,

Comment faire pour définir une structure utilisable dans différents fichiers sources?

J'ai écrit dans structure.h :
struct s_point { float abscisse; float ordonnee;};
typedef struct s_point points;



Dans les fichiers .c je n'ai pas oublié d'écrire :
#include "structure.h"

Mais la compilation n'aboutit pas :

structure.h:1: error: redefinition of ‘struct s_point’
structure.h:2: error: redefinition of typedef ‘points’


et je ne comprends pas les messages d'erreurs.

D'où peut venir le problème?

Merci d'avance pour vos réponses.
A voir également:

1 réponse

tatou_38 Messages postés 1928 Date d'inscription vendredi 21 avril 2006 Statut Membre Dernière intervention 5 août 2015 120
30 avril 2009 à 23:04
struct s_point { float abscisse; float ordonnee;};

Cette ligne déclare la structure s_point. Comme tu le mets dans ton fichier .h, l'objet s_point va être déclaré dans tous les sources .c qui incluent ton fichier .h. D'où un problème à l'édition des liens qui trouve plusieurs objets de même nom !!!

Dans un fichier .h, tu définit des types de données,
Sans un source .c tu déclare des objets


Si tu as besoin de te référer à un même objet dans plusieurs sources .c, alors il faut le déclarer dans un seul de ces sources, et en extern dans les autres. Avec des #define tu peux t'arranger pour mettre la déclaration de l'objet dans ton fichier .h :

typedef struct {
float abscisse;
float ordonnee;
} tPoint;

#ifdef FICHIER_PRINCIPAL
typedef tPoint points;
#else
extern typedef tPoint points;
#else


1
merci bcp tatou_38, j'avais écrit dans .h :
extern struct s_point { float abscisse; float ordonnee;};
typedef struct s_point points;

mais j avais le message suivant :
balayage.h:2: warning: useless keyword or type name in empty declaration

Finalement en écrivant simplement ce que tu m as dit, à savoir :
typedef struct {
float abscisse;
float ordonnee;
} points;

plus de message de warning, je crois que c est parce que ma définition était redondante, c est ca?
0