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 :

unknown type name d'un typedef struct dans fichier *.h


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Novembre 2016
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : Novembre 2016
    Messages : 39
    Points : 15
    Points
    15
    Par défaut unknown type name d'un typedef struct dans fichier *.h
    Bonjour à tous,

    J'ai un soucis que j'aimerais comprendre sur l'utilisation d'un typedef struct en langage C. J'explique:

    J'ai déclaré un typedef struct dans application.h que je veux rendre utilisable dans un autre module dénommé temperature (.c et .h).
    Dans temperature.h j'appelle application.h. Dans temperature.c j'apelle temperature.h. Je déclare une variable avec mon nouveau type dans temperature.c et la rend portable en la redéclarant en extern dans temperature.h.

    J'ai un fichier application.h qui contient cela

    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
    20
    21
    22
    23
     
    #ifndef SOURCES_APPLICATION_H_
    #define SOURCES_APPLICATION_H_
     
    #include "TypeDef.h"
    #include "Temperature.h"
     
    typedef struct
    {
    	FLOAT64 CoefficientA1_F64;
    	FLOAT64 CoefficientA2_F64;
    	FLOAT64 CoefficientB0_F64;
    	FLOAT64 CoefficientB1_F64;
    	FLOAT64 CoefficientB2_F64;
    	FLOAT32 OldOldRawValue_F32;
    	FLOAT32 OldRawValue_F32;
    	FLOAT32 RawValue_F32;
    	FLOAT32 OldOldFilteredValue_F32;
    	FLOAT32 OldFilteredValue_F32;
    	FLOAT32 FilteredValue_F32;
    }ButterwothSecondOrderFilterParameter_str;
     
    #endif

    Dans temperature.c j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #include "Temperature.h"
     
    ButterwothSecondOrderFilterParameter_str TMP_TemperatureLowPassFilterParameter_STR;
    Dans un fichier temperature.h j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #ifndef SOURCES_TEMPERATURE_H_
    #define SOURCES_TEMPERATURE_H_
     
    #include "TypeDef.h"
    #include "Application.h"
     
    extern ButterwothSecondOrderFilterParameter_str TMP_TemperatureLowPassFilterParameter_STR;
     
    #endif
    J'ai volontairement pas affiché les autres déclarations (d'include, variables, prototypes de fonction, enum, etc....) sinon ce serait lourd à l'affichage.

    A la compilation j'ai un fameux : unknown type name 'ButterwothSecondOrderFilterParameter_str' sur temperature.h et je ne vois pas où mon erreur....
    J'ai utilisais ce nouveau de type de variable dans un autre module et j'ai le même problème.
    Quand je supprime la déclaration extern dans temperature.h l'erreur disparait.

    Ce que je ne comprend pas non plus, c'est que j'ai un fichier TypeDef.h qui comprend uniquement des typedef avec lequel je fonctionne de la même manière sans aucun soucis sur tous mes modules. Quand je déplace mon typedef struct dans ce fichier (et que je l’appelle dans temperature.h) l'erreur disparaît.

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    #ifndef SOURCES_TYPEDEF_H_
    #define SOURCES_TYPEDEF_H_
     
    typedef  unsigned char BOOL;
    #define TRUE 1
    #define FALSE 0
     
    typedef char CHA;
     
    typedef unsigned char UINT8;
    typedef signed char SINT8;
     
    typedef unsigned short UINT16;
    typedef signed short SINT16;
     
    typedef unsigned long dword;
    typedef unsigned long UINT32;
    typedef signed long SINT32;
     
    typedef unsigned long long UINT64;
    typedef signed long long SINT64;
     
    typedef float FLOAT32;
    typedef double FLOAT64;
    typedef long double FLOAT80;
     
    #endif

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Hello,

    Chez moi, ça fonctionne... N'as-tu pas enlevé trop de choses ?

    Au passage, c'est Butterworth

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Novembre 2016
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : Novembre 2016
    Messages : 39
    Points : 15
    Points
    15
    Par défaut
    Bien vu le "r", je l'avais oublié.

    C'est bizarre ça me fait ça avec d'autres typedef d'autres modules mais ça fonctionne avec un fichier seul.

    Et ce que je trouve curieux, c'est que le fichier temperature.h fait le lien entre application.h et temperature.c pour que ce dernier connaisse ce "typedef struct" mais que lui même ne le connaisse pas...

    Après enlevé trop de chose, je ne peux pas mettre les 3 fichiers complet car eux-même font appel à d'autres modules, etc...

    Eventuellement je peux mettre temperature.h complet mais à part des define, des structure et des prototypes de fonctions à la suite de ma variable qui génére l'erreur il n'y a rien.

    Comme ça le fait avec d'autres modules, ce ne serait pas un problème de configuration ?
    J'ai créé un nouveau fichier test.h j'y ai mis le typedef struct, j'ai appelé test.h dans temperature.h et ça fonctionne...

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    As-tu bien vérifié de ne pas avoir le même #define de garde d'inclusion dans 2 fichiers *.h ?

  5. #5
    Invité
    Invité(e)
    Par défaut
    Le problème est que tu as une dépendence circulaire entre Application.h et Temperature.h; ces deux headers s'incluent mutuellement.

    Lors de la compilation du programme, l'ordre des #include fait que le compilateur tombe sur Application.h en premier et l'anaylse donc avant Temperature.h.

    En analysant Application.h, il tombe sur #include "Temperature.h" qui n'a encore jamais été analysé et inclu donc son contenu avant de voir le typedef.

    Il va donc voir cela au final:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ...
    extern ButterwothSecondOrderFilterParameter_str TMP_TemperatureLowPassFilterParameter_STR;
    ...
    typedef struct{...}ButterwothSecondOrderFilterParameter_str;
    Tu te retrouve donc avec la déclaration d'une variable dont le type n'existe pas encore à ce moment.

    Il te faut faire en sorte d'enlever cette inclusion mutuelle ou arranger l'ordre d'inclusion de tes headers de sorte que le compilateur tombe sur Temperature.h en premier. Tu as meilleur temps de résoudre ce problème d'inclusion mutuelle en forward déclarant les éventuelles choses dont tu aurais besoin.

    EDIT : Clarté du texte
    Dernière modification par Invité ; 14/11/2016 à 15h57.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Novembre 2016
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : Novembre 2016
    Messages : 39
    Points : 15
    Points
    15
    Par défaut
    J'ai revérifié toutes mes gardes d'inclusions pas de soucis.

    Je vais regarder ce principe de "forward declaration" que je ne connais pas.

    Merci à tous pour votre aide.

    Sam

Discussions similaires

  1. erreur: unknown type name
    Par missDii dans le forum Débuter
    Réponses: 2
    Dernier message: 18/12/2013, 08h37
  2. erreur: unknown type name ‘GtkCssProvider’
    Par troumad dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 12/11/2013, 16h05
  3. unknown type name
    Par dergeekpanda dans le forum C
    Réponses: 7
    Dernier message: 31/08/2012, 14h25
  4. [Objective-C] unknown type name 'QTVisualContextRef'
    Par Miscellaneous dans le forum Objective-C
    Réponses: 0
    Dernier message: 26/03/2011, 14h53
  5. typedef struct dans une liste d'initialisations
    Par titibete dans le forum C++
    Réponses: 3
    Dernier message: 17/11/2010, 20h39

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