Historique de la question :
La portée des variables est un concept fondamental depuis l'apparition des langages de programmation. En C++, les règles de portée des variables ont évolué avec l'introduction de nouveaux standards (des déclarations locales aux espaces de noms anonymes, expressions lambda et blocs try/catch).
Problème :
Une mauvaise compréhension de la portée des variables peut entraîner des erreurs à la compilation ou à l'exécution, par exemple, des collisions de noms, le masquage accidentel de variables, des fuites de mémoire, des valeurs non initialisées.
Solution :
En C++, les principaux niveaux de portée sont :
Il est important de se rappeler des règles de recherche d'identifiants (name lookup) : le compilateur cherche la définition la plus "proche", puis remonte si nécessaire.
Exemple de code :
#include <iostream> void func() { int x = 1; { int x = 2; // masquage de la variable externe x std::cout << x << '\n'; // Affichera : 2 } std::cout << x << '\n'; // Affichera : 1 } int x = 10; // variable globale int main() { func(); std::cout << x << '\n'; // Affichera : 10 }
Caractéristiques clés :
Une variable déclarée dans un fichier d'en-tête en dehors de toute fonction peut-elle être la cause d'une erreur de lien ?
Oui ! Si la variable est simplement déclarée comme int value (sans extern et sans initialisation inline avec des variables inline en C++17), elle créera plusieurs définitions et entraînera une erreur de définition multiple au moment de la liaison.
Exemple de code :
// myheader.h int globalVar = 5; // MAUVAIS : définition, et non déclaration
Que se passe-t-il si une variable avec le même nom est déclarée à l'intérieur d'un bloc interne ?
La variable interne "masquera" l'externe, et tous les accès se feront à celle-ci jusqu'à la fin du bloc interne.
Une variable déclarée dans l'en-tête d'une fonction est-elle disponible dans d'autres fonctions ?
Non. Les variables déclarées (et définies) à l'intérieur du corps d'une fonction n'existent que durant l'exécution de cette fonction. Elles ne sont pas accessibles en dehors.
Dans un projet pour le stockage d'état, une variable globale est définie dans plusieurs fichiers sources via l'inclusion de l'en-tête.
Avantages : Facile d'accès depuis n'importe où.
Inconvénients : Difficultés de débogage, définition multiple (erreur de lien), absence de sécurité thread, valeurs inattendues.
Utilisation de variables locales, passage d'état par les paramètres des fonctions, presque aucune variable globale ou utilisées extern et uniquement avec encapsulation via des espaces de noms.
Avantages : Transparence du code, gestion des dépendances, facilité des tests.
Inconvénients : Parfois nécessite plus de code que l'utilisation de variables globales.