Les variables globales sont apparues dans le langage C dès le début comme un moyen de stockage de données accessibles dans toutes les fonctions du programme. Elles permettent d'organiser l'échange d'informations entre différentes parties du code sans passer explicitement des valeurs via des paramètres de fonction. Ces variables sont stockées dans une zone mémoire distincte et existent pendant toute la durée du programme.
L'utilisation excessive et incontrôlée des variables globales entraîne des problèmes de maintenance du code, complique la recherche d'erreurs et augmente les risques de conflits de noms. Dans les grands projets, il est difficile de comprendre où se produisent des modifications des données disponibles globalement, ce qui complique le débogage. De plus, une déclaration incorrecte des variables globales dans différents fichiers (modules) peut entraîner des erreurs de liaison (linker errors) et un doublonnage de données.
La pratique optimale consiste à déclarer explicitement les variables globales dans un fichier .c et à déplacer leurs prototypes avec le mot-clé extern dans des fichiers d'en-tête .h. Cela crée un seul endroit de stockage, et le compilateur empêche le doublonnage. Pour minimiser les variables globales, on utilise des variables statiques avec une portée limitée au fichier. L'utilisation excessive de l'état global est remplacée par des structures de données qui sont passées entre les fonctions.
Exemple de code :
// file.h #ifndef FILE_H #define FILE_H extern int global_counter; #endif // file.c #include "file.h" int global_counter = 0; // main.c #include "file.h" #include <stdio.h> int main() { global_counter++; printf("%d\n", global_counter); return 0; }
Caractéristiques clés :
Peut-on déclarer une variable globale comme statique ? En quoi se distingue-t-elle d'une variable globale classique ?
Oui, une variable globale déclarée avec le mot-clé static ne sera visible que dans le fichier où elle a été déclarée. Elle vit encore pendant toute l'exécution du programme, mais une autre compilation (un autre fichier .c) ne pourra pas y accéder. Cela s'utilise pour encapsuler des données au niveau du fichier.
Faut-il absolument utiliser extern pour accéder à une variable globale depuis un autre fichier ?
Oui, si vous voulez accéder à une variable globale définie dans un autre module, il est nécessaire de la déclarer avec le mot-clé extern (généralement dans le fichier d'en-tête). Sinon, le compilateur considérera que vous redéfinissez la variable.
// a.c int global_var = 1; // b.c extern int global_var;
Le code suivant fonctionnera-t-il ?
// a.c int var; // b.c int var;
Non, ce code entraînera une erreur de liaison, car la variable est définie deux fois. La définition d'une variable globale doit être unique, et pour y accéder, utiliser extern.
Un développeur dispose des paramètres de configuration dans des variables globales sans restrictions d'accès :
Avantages :
Inconvénients :
Les variables globales sont définies uniquement dans un fichier, accessibles via extern, et sont strictement documentées. Dans d'autres cas, on utilise une portée statique de fichier ou une structuration des paramètres :
Avantages :
Inconvénients :