Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Syntaxe error - structure

2 réponses
Avatar
gatzo
Bonjour,

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

2 réponses

Avatar
Mickaël Wolff
gatzo a écrit :

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
Avatar
Samuel Devulder
gatzo a écrit :

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.