j'ai ecrit ca :
Declaration.h
typedef struct
{
int Max;
int Min;
int Zero;
}strEtalonnage;
typedef struct
{
unsigned int sec;
unsigned int min;
unsigned int hr;
unsigned int wkd;
unsigned int day;
unsigned int mth;
unsigned int yr;
}strDate;
typedef struct
{
int Serie;
int Version;
int Type;
strEtalonnage Etalonnage;
strDate Date;
}strEntete;
strEntete _Entete;
Variables.h
extern strEntete _Entete;
du coup, afin d'avoir acces � _Entete dans tous mes .c, j'inclue Declaration.h
dans mon main, et variables.h dans tous les autres .c
Sauf qu' � la compilation j'ai l'erreur sui vante
Variables.h:2: error: syntax error before "_Entete"
Variables.h:2: warning: type defaults to `int' in declaration of `_Entete'
Variables.h:2: warning: data definition has no type or storage class
Je n'arrive pas � comprendre d'ou viens l'erreur
> Variables.h:2: error: syntax error before "_Entete"
> Variables.h:2: warning: type defaults to `int' in declaration of `_Entete'
> Variables.h:2: warning: data definition has no type or storage class
>
> Je n'arrive pas � comprendre d'ou viens l'erreur
L'erreur vient du fait que dans Variables.h, la structure n'est pas
d�finie. Du coup, lorsque tu fais r�f�rence au type de _Entete, le
compilateur ne sait pas de quel type de donn�es il s'agit.
En gros, voici les fichiers que tu devrais avoir :
== 8< == Variables.c ==
#include "Variables.h"
strEntete _Entete;
== >8 == Variables.c ==
== 8< == Variables.h ==
/* d�claration des structures
*/
extern strEntete _Entete;
== >8 == Variables.c ==
== 8< == main.c ==
#include "Variables.h"
/* Exemple bidon d'usage dans main
*/
int main(void) /* Merci � celui qui m'a confirm� pour le void ;) */
{
return _Entete.Type ;
}
== >8 == Variables.c ==
--
Micka�l Wolff aka Lupus Michaelis
http://lupusmic.org
> du coup, afin d'avoir acces � _Entete dans tous mes .c, j'inclue Declaration.h
> dans mon main, et variables.h dans tous les autres .c
>
> Sauf qu' � la compilation j'ai l'erreur sui vante
>
> Variables.h:2: error: syntax error before "_Entete"
> Variables.h:2: warning: type defaults to `int' in declaration of `_Entete'
> Variables.h:2: warning: data definition has no type or storage class
>
> Je n'arrive pas � comprendre d'ou viens l'erreur
C'est normal. Quand tu inclues Variables.h dans tes ".c" hors main.c,
c'est comme si tu �crivais
extern strEntete _Entete;
directement dans ton code � cet endroit. Tu te rends alors facilement
compte que nulle part dans le code de ces ".c" n'est d�fini le symbole
"strEntete".
Du coup le compilo grogne et assume que c'est un entier (en g�n�ral, le
C quand il ne sait rien, par exemple dans la syntaxe K&R quand on oublie
de typer une variable, le C donc, assume que la variable est un "int").
Avant d'utiliser une structure il faut l'avoir d�finie! Le compilo a
besoin de la d�finition pour savoir combien d'octets r�server � la
variable "_Entete". Le seul cas o� on peut se passer de la d�finition
c'est quand on d�clare un pointeur, car la taille du pointeur ne d�pends
pas de la taille de la donn�e point�e:
extern strMachin *_Entete_ptr;
Mais m�me dans ces cas l� il te faudra avoir la d�finition de strEntete
si tu d�r�ferences ton pointeur (en acc�dant � l'un des champs par
exemple: _Entete_ptr->Serie, car il faut bien savoir "o�" se situe ce
champ dans l'organisation m�moire de la structure).
Pour en revenir � ton probl�me, je te propose que d�claration.h s'occupe
de tout d�clarer sans rien r�server (bref tu ajoutes "extern" devant la
d�claration de strEntete), que tu remplaces partout Variables.h par
Declaration.h, et que dans ton main.c tu d�clares la variable _Entete
sans l'extern, ce qui indiquera � ton compilo que c'est l� que se
trouvera sa zone m�moire.
Bien d'autres solutions sont possibles. L'important est de d�clarer tes
variables extern partout o� tu en as besoin avec les types qui vont bien
et de r�server leur zone m�moire via une d�claration sans "extern" � un
seul endroit.
A toi d'organiser des header pour respecter ce principe (par exemple,
Declaration.h peut inclure Variables.h *et* d�clarer "strEntete
_Entete;" aussi. Mais bon un fichier ".h" � l'usage seul de main.c ca se
discute, on au aussi vite fait d'ecrire et de maintenir le fichier
"Variables.h" g�n�ral et d�clarer _Entete dans main.c. (Bref la solution
que je proposais).
sam.