255Fermer257
XimoonLe 21/04/2009 à 14:17
Donc : retour sur l'extern happy

En fait, le compilateur ne connait, dans un fichier, que ce qu'il a vu avant le code courant. Si tu as mis un "include", ça va faire un copier/coller, comme en assembleur, et ainsi rajouter des connaissances a priori au fichier courant.
C'est pour ça que pour les fonctions tu dois déclarer un prototype, pour dire au compilateur à quoi ressemble la fonction, et c'est pour ça que ce prototype doit être mis avant l'appel. En pratique, on met les prototype dans un header et on l'inclut au début du fichier où l'on veut appeler cette fonction.
Pour les variables, c'est exactement la même chose, sauf que le "extern" doit être ajouté explicitement, alors que pour une fonction, un prototype est implicitement déclaré comme étant "extern" (tu peux le rajouter si tu veux, certains le font par souci de clarté).

On a donc :

- dans un header (par exemple glob_Types.h):

typedef struct Ma_Structure_s
{
...
}
Type_De_Ma_Structure_t;

- dans un fichier .c (par exemple glob_Datas.c)

#include "glob_Types.h"
...
Type_De_Ma_Structure_t Ma_Variable_Globale;

- dans un header (par exemple glob_Datas.h)

#include "glob_Types.h"
...
extern Type_De_Ma_Structure_t Ma_Variable_Globale;

- dans un autre fichier .c, où est ton code qui utilise la variable :

#include "glob_Datas.h"
...
Ma_Variable_Globale.Truc = Machin;

Donc dans l'ordre :
- déclaration du type
- création effective de la variable
- création du prototype de la variable
- utilisation de la variable

Note que rien ne t'empêche de mettre tout dans un même header, ou de tout déclarer directement dans le fichier .c où tu utilises tout ça, là, c'est une question de rêgles de codage, et j'utilise les miennes dans mes exemples cheeky