IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Un problème d'include (circulaire?)


Sujet :

C

  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2012
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 57
    Points : 76
    Points
    76
    Par défaut Un problème d'include (circulaire?)
    Bonjour,

    Je poste ce message aujourd'hui car je n'arrive pas à résoudre une erreur de compilation dans un projet que je développement en ce moment.
    Voici à quoi ressemblent mes fichiers:

    main.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <stdio.h>
    #include <stdlib.h>
    #include "source2.h"
     
    int main()
    {
        printf("Hello world!\n");
        return 0;
    }
    source1.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #ifndef SOURCE1_H
    #define SOURCE1_H
     
    #include "source2.h"
     
     
    typedef struct
    {
        int atrb1;
        int atrb2;
    } T_Struct1;
     
    void funct(T_Struct1 pParam1, T_Struct2 pParam2);
     
     
     
     
    #endif // SOURCE1_H

    source2.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #ifndef SOURCE2_H
    #define SOURCE2_H
     
    #include "source1.h"
     
     
    typedef struct
    {
        int atrb1;
        int atrb2;
    } T_Struct2;
     
    void funct2(T_Struct1 pParam1, T_Struct2 pParam2);
     
     
    #endif // SOURCE2_H
    Si dans le main j'inclue source1.h je me retrouve avec l'erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C:\Users\Daniel\Mon dossier\Test\source2.h|13|parse error before "pParam1"|
    Et si j'include source2.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C:\Users\Daniel\Mon dossier\Test\source1.h|13|parse error before "T_Struct2"|

    Je pense comprendre d'où vient le problème: lorsque je fais un include de source2.h dans source1.h le prototype de funct2 a besoin de la structure définie dans source1.h mais cette dernière ne sera définie qu'une fois que source2.h aura fini d'être définie elle même
    (je ne sais pas si je suis assez clair )
    Est-ce que quelqu'un aurait une solution à ce problème, sachant qu'il est important que ces structures soient dans des fichiers séparés?

    En vous remerciant par avance,

  2. #2
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Bonjour,

    Tu as plusieurs solutions pour résoudre ton problème

    • Ne créer qu'un include
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      #ifndef SOURCE_H
      #define SOURCE_H
       
      typedef struct
      {
          int atrb1;
          int atrb2;
      } T_Struct1;
       
      typedef struct
      {
          int atrb1;
          int atrb2;
      } T_Struct2;
       
      void funct(T_Struct1 pParam1, T_Struct2 pParam2);
      void funct2(T_Struct1 pParam1, T_Struct2 pParam2);
       
      #endif
    • Créer des includes qui ne contiennent que les définitions des structures et les inclure quand tu as besoin de les connaître :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      #ifndef DEF_STRUCT1
      #define DEF_STRUCT1
       
      typedef struct
      {
          int atrb1;
          int atrb2;
      } T_Struct1;
       
      #endif
      Idem pour T_Struct2, puis :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      #ifndef SOURCE1_H
      #define SOURCE1_H
       
      #include "def_struct1.h"
      #include "def_struct2.h"
       
      void funct(T_Struct1 pParam1, T_Struct2 pParam2);
      Idem pour source2.h
    • Modifier tes fonctions pour qu'elles utilisent des pointeurs sur tes stuctures et faire des forward declarations
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      #ifndef SOURCE1_H
      #define SOURCE1_H
       
      struct T2;
       
      typedef struct T1
      {
          int atrb1;
          int atrb2;
      } T_Struct1;
       
      void funct(struct T1 *pParam1, struct T2 *pParam2);
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      #ifndef SOURCE2_H
      #define SOURCE2_H
       
      struct T1;
      typedef struct T2
      {
          int atrb1;
          int atrb2;
      } T_Struct2;
       
      void funct2(struct T1* pParam1, struct T2 *pParam2);
       
       
      #endif // SOURCE2_H

  3. #3
    Membre régulier
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2012
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 57
    Points : 76
    Points
    76
    Par défaut
    Bonjour kwariz,


    Merci pour cette réponse à la fois rapide et complète. Je vais tester tout ça et si je n'ai plus d'erreur je marquerai le sujet comme "Résolu".

    Juste une petite question :
    J'hésite entre utiliser la 2eme et la 3eme solution. Selon vous laquelle est la plus "propre"/standard?


    En vous remerciant par avance,
    Cordialement,

  4. #4
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    C'est en grande partie une question de style et de préférences personnelles.
    Néanmoins, l'idéal à mon sens serait d'avoir un module qui ne s'occupe que de ce qui concerne la première structure, un autre pour ce qui concerne la seconde et un troisième qui regroupe ce qui concerne les deux. Quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #ifndef STRUCT1_H
    #define STRUCT1_H
     
    typedef struct T1 StructT1;
    struct T1 {
     ...
    }
     
    void f1_1(StructT1 param1);
    void f1_2(StructT1 param1, const char* param2);
    void f1_3(StructT1 param1, ...);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #ifndef STRUCT2_H
    #define STRUCT2_H
     
    typedef struct T2 StructT2;
    struct T2 {
     ...
    }
     
    void f2_1(StructT2 param1);
    void f2_2(StructT2 param1, const char* param2);
    void f2_3(StructT2 param1, ...);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #ifndef BIDULE_H
    #define BIDULE_H
     
    #include "structt1.h"
    #include "structt2.h"
     
    void g_1(StructT1 param1, StructT2 param2);
    Cela permet de bien séparer les responsabilités, l'implémentation est plus claire, ...

    Quant à l'utilisation ou non de pointeurs plutôt que de passer des structures en paramètres c'est également en partie une affaire de goût. Toutefois, comme les paramètres sont passés par copie le coût de la copie de grosses structures peut être pénalisant

    Je pense que par défaut j'opterais pour le découpage ci-dessus en utilisant des pointeurs sur les structures.

  5. #5
    Membre régulier
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2012
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 57
    Points : 76
    Points
    76
    Par défaut
    Je vois.

    Encore un grand merci à vous, cela m'aura été très instructif !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Configuration] problème d'include à cause de l'arborescence
    Par hoaxpunk dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 8
    Dernier message: 15/12/2005, 17h00
  2. [EasyPHP] Problème d'include de fichier et adresse des images
    Par doudou34 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 8
    Dernier message: 02/11/2005, 21h46
  3. problèmes avec "include file" pour une page asp
    Par chipsense dans le forum ASP
    Réponses: 1
    Dernier message: 02/09/2005, 15h22
  4. [JSP] problème d'include ou d'import
    Par lipao17 dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 06/04/2005, 13h39
  5. Problème d'include sous Dev-c++ 4.9.8.0
    Par Argonz dans le forum Dev-C++
    Réponses: 16
    Dernier message: 20/11/2003, 17h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo