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 :

expected specifier-qualifier-list before ‘data_a_t’


Sujet :

C

  1. #1
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    630
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 630
    Points : 234
    Points
    234
    Par défaut expected specifier-qualifier-list before ‘data_a_t’
    Bonjour,

    J'ai un problème d'inclusion de fichiers d'entête. J'ai refais un code en version simplifiée pour que vous compreniez le problème (le vrai code contient des structures hyper longues):

    data_a.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #ifndef DATA_A_H
    #define DATA_A_H
     
    #include "data_b.h"
     
    typedef struct data_a {
    	int i;
    	data_b_t db;
    } data_a_t;
     
    #endif
    data_b.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #ifndef DATA_B_H
    #define DATA_B_H
     
    #include "data_a.h"
     
    typedef struct data_b {
    	char c;
    	data_a_t da;
    } data_b_t;
     
    #endif
    expected_specifier_qualifier_list_before.c:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include "data_a.h"
    #include "data_b.h"
     
    int main() {	
    	return 0;
    }
    et l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    In file included from data_a.h:4,
                     from expected_specifier_qualifier_list_before.c:1:
    data_b.h:8: error: expected specifier-qualifier-list before ‘data_a_t’
    Je pense que c'est un problème classique mais je ne trouve pas la (bonne) solution.
    Une solution serait de fusionner les deux structures data_a data_b dans un seul fichier.
    Le problème avec cette solution c'est qu'il faudrait changer pas mal de choses dans d'autres fichiers cources...

    Merci d'avance pour votre aide.

  2. #2
    Membre éclairé
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Points : 807
    Points
    807
    Par défaut
    Bonsoir,

    C'est illogique ce que tu essayes de faire. Tes deux structures s'incluent mutuellement de manière infinie : c'est impossible. Si tu souhaites une récursivité croisée dans tes définitions, alors il faudra utiliser au moins un pointeur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    typedef struct data_a {
    	int i;
    	data_b_t *db;
    } data_a_t;
     
    /* ... */
     
    typedef struct data_b {
    	char c;
    	data_a_t *da;
    } data_b_t;
    Bonne soirée !
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  3. #3
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 186
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 186
    Points : 17 126
    Points
    17 126
    Par défaut
    Bonjour!
    La solution à été exposée, le problème apparait aussi en C++ sous le nom "incomplete type" ou "partial type"

    En fait, tu ne peux utiliser une variable que sur un type pleinement déclaré, hors, chaque type de structure n'est terminé que lorsque l'autre l'aura été.

    Pour ce genre de problème, utilise l'option -E de gcc (préprocesseur seulement) peut aider, sauf si on a trop d'entête standard.

    Citation Envoyé par ikuzar Voir le message
    Bonjour,
    […]
    Une solution serait de fusionner les deux structures data_a data_b dans un seul fichier.
    Le problème avec cette solution c'est qu'il faudrait changer pas mal de choses dans d'autres fichiers cources...
    En fait, non, parce qu'il n'y a quasiment aucun lien entre en-têtes et fichiers "sources".
    Un en-tête peut être implémenté dans plusieurs unités de compilations (les .c), et une unité de compilation peut implémenter plusieurs en-têtes.

    Le seul effet de la fusion des en-têtes sera de remplacer les #includes.

    La seule contrainte est la règle de la définition unique: "ce qui est utilisé doit être défini une et une seule fois".
    Cette règle est vérifiée lors de l'édition de lien, au moment de réunir les différents unités de compilations en un exécutable.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

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

Discussions similaires

  1. error: expected specifier-qualifier-list before
    Par damien22530 dans le forum Débuter
    Réponses: 2
    Dernier message: 05/07/2015, 13h33
  2. erreur: expected type-specifier before
    Par julie_n3k0 dans le forum C++
    Réponses: 4
    Dernier message: 30/08/2009, 16h49
  3. Réponses: 7
    Dernier message: 22/09/2006, 16h52
  4. Réponses: 2
    Dernier message: 03/06/2006, 23h33
  5. Réponses: 5
    Dernier message: 05/05/2006, 19h07

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