9.6.2 Les variables globales

Icône de l'outil pédagogique Les variables globales

 

On évite au maximum d'utiliser des variables globales. On peut en général les remplacer, quand elles "paraissent" utiles, par le passage en paramètre par adresse (cf Chap. Pointeurs).

Les variables globales sont à utiliser de façon exceptionnelle : sauf exception particulière (indiquée cidessous), on peut toujours s'en passer.

 
A quoi reconnaît‐on une variable globale ? Quelles sont ses caractéristiques ?

Une variable devient globale dès qu’elle est définie en dehors de toute fonction, en général au début du fichier. Elle est utilisable par toutes les fonctions du fichier. Elle existe pendant toute la durée du programme. Son emplacement mémoire est connu dès l'édition de liens (juste après la compilation).

Une variable globale est une variable "publique" utilisable par tout le monde. Cette apparente simplicité est trompeuse : le programme est beaucoup plus difficile à lire, on ignore tout du passé et de l'avenir de la variable si on n'épluche pas tout le programme (aucune traçabilité), et la programmation à plusieurs devient risquée, car des variables globales et locales peuvent porter par erreur le même nom. C’est une source d’erreurs fréquentes qui sont difficiles à trouver !

Les variables globales ne sont globales que dans la partie du fichier qui suit leur définition. Elles doivent être placées en tête du fichier pour la lisibilité. En compilation séparée, il est conseillé de placer la définition des variables globales au sommet du fichier du main ; elles sont alors simples à trouver.

Insistons : évitez les variables globales. Nous verrons dans le chapitre sur les pointeurs que le passage par adresse des paramètres permet d'éviter l'utilisation de variables globales dans la quasi‐totalité des cas.

 
Dans quel cas je peux utiliser une variable globale ?

De façon général, dès que le passage en paramètre n’est pas possible. C’est le cas de toutes les fonctions qui ont un prototype figé : faute de pouvoir disposer de paramètres pour dialoguer avec elles, il faut utiliser des variables globales qui matérialisent des données ou des flags (drapeaux de signalisation). Exemples :

– en programmation Windows, pour échanger des données entre fonctions Callback ou Threads.
– pour dialoguer avec une routine d’interruption.

Exceptionnellement, dans un programme qui utilise tout le temps une « grosse » variable « centrale » (toujours un tableau ou une structure), on peut tolérer de rendre cette variable globale.

Pour éviter les problèmes, donnez à vos variables globales des noms « compliqués », de préférence qui commencent par g. Exemples : gflag_dessin, ghandle_canal, gdata_a_emettre.

 


C’est alors la variable locale qui est utilisée, mais cette situation est explosive !