Les variables
Voici un extrait de programme :
int gj = 0;
int gi;
int fonction1 (int p1) {
int li = 1;
gj = 4;
...
}
int fonction2 (int p1) {
int li = 2;
int gi = 3;
...
}
int main (int argc, char **argv) {
int li = 3;
gi=5;
return 0;
}
Quelles sont les variables globales, les variables locales ?
Variables globales / variables locales
La notion de global/local est issue de la visibilité de la variable : une variable globale est créée au début du programme et détruite à la fin du programme. Ce type de variable est visible.accessible en tout point du progrmme (du moins dès qu'elle a été définie). Une variable locale n'est visible que dans la fonction où elle est déclarée. Dans le cas général, la variable est créée à chaque nouvel appel de la fonction et détruite à la fin de la fonction. Les paramètres des fonctions sont des variables locales pour les fonctions (ce sont des copies des variables ou valeurs passées en paramètre).
Dans le fonction fonction2()
, on a
déclaré une variable locale gi
de
même nom qu'une variable globale. Dans ce cas présent, la
variable locale cache la variable globale qui n'est plus accessible. Il
faut donc faire attention au "recouvrement".
Variables locales : automatiques ou statiques
Toutes les variables locales sont par défaut automatiques (mot-clé auto) : elles sont créées à chaque appel de la fonction et détruites à la fin.
Imaginons que l'on veuille compter le nombre de fois où est appelé une fonction :
int fonction1 (int p1) {
static int compteur = 0;
auto int i; /* auto est optionnel */
++compteur;
printf("%d", compteur);
...
}
La variable compteur
est une variable dite statique.
C'est une variable qui est créée et initialisée
uniquement au premier appel de la fonction et qui est détruite
(comme une variable globale) à la fin de l'exécution du
programme. La valeur est gardée d'un appel à l'autre de
la fonction. C'est bien une variable locale car on ne peut y
accéder en dehors de la fonction qui la définit.
Variables "externes" explicites
Quand on veut utiliser une variable définie dans un autre
fichier, on utilise le mot-clé extern
.
extern int g;
Une telle déclaration est en général
placée dans un fichier en-tête. C'est une
déclaration explicite. Il existe des variables externes
implicites
(Dans notre exemple, gj
est est variable "externe" pour
la fonction main()
).
Variables de type "registre"
Pour certaines variables qui sont utilisées très
souvent, on peut indiquer le mot register
. Si cela est
possible, la
machine va essayer d'utiliser un registre du processeur pour stocker
cette valeur.
register int r;
Attention, on ne peut pas placer tous les types de
variables en "register". De plus, on ne peut accèder à
l'adresse mémoire d'une variable de type registre. Cette
optimisation date un peu maintenant, on doit pouvoir faire confiance au
compilateur (au moins en -O2
).