Références croisées en C

Références croisées en C - C - Programmation

Marsh Posté le 10-07-2005 à 16:53:16    

J'ai un problème en C:
Je dois créer deux structures, appelées A et B: A possède un membre de type B, et B possède un membre de type A *. Jusque là, tout va bien, je déclare A et B dans le même header. Maintenant, j'aimerais séparé ces deux structures dans deux fichiers différents. Donc voici ce que j'ai fait;

Code :
  1. //A.h
  2. #ifndef _A_H_
  3. #define _A_H_
  4. #include "B.h"
  5. typedef struct _A
  6. {
  7.    B b_member;
  8. } A;
  9. #endif


 

Code :
  1. //B.h
  2. #ifndef _B_H_
  3. #define _B_H_
  4. typedef struct _A A;
  5. typedef struct _B;
  6. {
  7.    A *a_pointer;
  8. } B;
  9. #endif


 
Mais lorsque je compile, le compilateur me renvoit l'erreur suivante: "redefinition of 'A'", ce qui est normal vu que après de l'#include, il y a deux "typedef struct _A A;" à la suite.
Comment je pourrais résoudre ce problème, sachant que j'aimerais éviter de tout mettre dans un seul fichier ou de passer par un troisième fichier?
 
Merci ;)


Message édité par _momone_ le 10-07-2005 à 16:54:43
Reply

Marsh Posté le 10-07-2005 à 16:53:16   

Reply

Marsh Posté le 10-07-2005 à 17:22:58    

Un extern ?

Reply

Marsh Posté le 10-07-2005 à 23:31:27    

Tu as quasiment le même problème que pour décrire une structure pointant sur elle-même (liste chaînée). Il te faut déclarer la structure avant de la définir.
 
Dans une liste chaînée

Code :
  1. typedef struct s_liste {   // Ici la structure "s_liste" est connue
  2.     variable;
  3.     variable;
  4.     struct s_liste *next;  // Tu peux donc l'utiliser
  5. } t_liste;


 
Il te faut déclarer "struct _A" avant de la définir

Code :
  1. // A.h
  2. #ifndef _A_H_
  3. #define _A_H_
  4. #include "B.h"
  5. typedef struct _A
  6. {
  7.    B b_member;
  8. } A;
  9. #endif


 

Code :
  1. //B.h  
  2. #ifndef _B_H_
  3. #define _B_H_
  4. // Déclaration de la structure "_A"
  5. struct _A;
  6. typedef struct _B;
  7. {
  8.    struct _A *a_pointer;
  9. } B;
  10. #endif


 
Voilà. J'ai pas testé mais cela devrait fonctionner...
 
 


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 11-07-2005 à 14:51:40    

_momone_ a écrit :

J'ai un problème en C


Ben oui, sinon, tu ne posterais pas là...

Citation :

Code :
  1. #ifndef _A_H_
  2. #define _A_H_




En dehors de qui a été dit, il ne faut pas utiliser d'identificateur commençant par _ suivit de _A-Z, car il sont réservés à l'implémentation.


#ifndef H_A
#define H_A


est correct (mais un peu court...)
 
http://mapage.noos.fr/emdel/codage.htm#nom_underscore
http://mapage.noos.fr/emdel/codage [...] ser_source


Message édité par Emmanuel Delahaye le 11-07-2005 à 14:52:57

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed