Comment bien définir les variables externes ?
Dans le programme
case0.c
int main()
{
int x;
x = 4;
}
x est d'abord déclaré comme int, et la mémoire est allouée pour x sur la ligne suivante. Pas de problèmes ici.
Cependant, si j'écris les fichiers (dans le cadre d'un programme plus important)
case1.c
extern int x;
x = 4;
Je reçois, de gcc, warning: data definition has no type or storage class
. De même, si je fais
case2.c
extern int x = 4;
gcc n'aime pas non plus et donnewarning: 'x' initialized and declared 'extern'
Le seul cas qui ne génère aucun avertissement est
case3.c
extern int x;
int x = 4;
Pourquoi le cas 1 donne-t-il une erreur, alors que le cas 0 ne le fait pas ? Le cas 3 est-il le seul et unique moyen de définir des variables externes ?
Solution du problème
x est d'abord déclaré comme int, et la mémoire est allouée pour x sur la ligne suivante. Pas de problèmes ici.
Non, ce n'est pas ce qui se passe. A l'intérieur d'une fonction, int x;
définit x
, qui lui réserve de la mémoire. Stocke ensuite x = 4;
une valeur dans cette mémoire.
extern int x;
x = 4;
extern int x;
déclare qu'il y a un x
mais ne le définit pas. Si le programme utilise this x
, il devrait le définir ailleurs.
En dehors d'une fonction, seules les déclarations doivent apparaître. Cependant, x = 4;
est une déclaration, donc ce n'est pas approprié en dehors d'une fonction.
extern int x = 4;
C'est du C valide, mais c'est une utilisation non conventionnelle, donc le compilateur vous avertit. Classiquement, on écrit int x = 4;
pour définir et initialiser x
, et on écrit extern int x;
pour déclarer x
sans le définir.
extern int x = 4;
est défini par la norme ; dans ce contexte, c'est effectivement la même chose que int x = 4;
. Mais les programmeurs n'utilisent généralement pas cette forme.
(S'il existe une déclaration antérieure visible de x
, telle que static int x;
, alors extern int x = 4;
diffère de int x = 4;
. extern int x = 4;
fera référence à la x
de la déclaration précédente, tandis que int x = 4;
tentera de créer un nouveau x
.)
extern int x;
int x = 4;
extern int x;
déclare x
mais ne le définit pas.
int x = 4;
le définit x
et l'initialise.
Le cas 3 est-il le seul et unique moyen de définir des variables externes ?
Si vous n'avez besoin d'utiliser que x
dans une seule unité de traduction, vous pouvez l'utiliser int x = 4;
seul, sans extern int x;
. Si vous devez utiliser x
dans plusieurs unités de traduction, vous devez placer extern int x;
un fichier d'en-tête et inclure ce fichier d'en-tête dans chaque fichier source qui utilise x
, y compris celui qui le définit.
Commentaires
Enregistrer un commentaire