Comment partager des variables entre fichiers en C++ : guide sur extern

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Pourquoi votre code ne compile pas : le mystère de extern en C++

\n\n

Avez-vous déjà écrit un programme soigné en C++, l'avez divisé en plusieurs fichiers, compilé — et obtenu un mur d'erreurs comme multiple definition of 'myVariable' ou undefined reference to 'myVariable' ? Cela vous dit quelque chose ? Si oui, vous n'êtes pas seul. La question "How do I use extern to share variables between source files?" fait partie des plus populaires sur Stack Overflow avec des dizaines de milliers de vues.

\n\n

Le problème est simple : quand un projet s'agrandit, garder tout le code dans un seul main.cpp est impossible. Mais comment faire pour qu'une variable, déclarée dans config.cpp, soit visible dans game.cpp et render.cpp ? L'intuition suggère : "Déclare-la simplement en globale !" — mais le compilateur pense autrement. Un petit mot-clé mais puissant vient à la rescousse : extern. Comprenons comment il fonctionne en pratique, pour que vous ne soyez plus jamais confus lors de l'édition de liens.

\n\n

Qu'est-ce que extern et pourquoi en a-t-on besoin ?

\n\n

En C++, chaque nom (variable, fonction, classe) doit être déclaré (declared) avant utilisation et défini (defined) exactement une fois. La définition est ce qui alloue la mémoire. La déclaration est simplement une promesse au compilateur : "Ne t'inquiète pas, la définition existe ailleurs dans un autre fichier, je te montre juste le type et le nom".

\n\n

Le mot-clé extern est exactement cette promesse. Il dit au compilateur : "Cette variable est définie ailleurs, ne lui alloue pas de mémoire ici — donne-moi simplement accès".

\n\n

Sans extern, chaque tentative de déclarer une variable globale dans deux fichiers .cpp entraînerait une erreur de l'éditeur de liens : deux définitions — deux zones mémoire — conflit.

\n\n

La règle des trois fichiers : comment organiser le code

\n\n

Le modèle standard pour partager des variables entre fichiers en C++ est le suivant :

\n\n
    \n
  1. Fichier de définition (*.cpp) — contient une définition de la variable.
  2. \n
  3. Fichier d'en-tête (*.h) — contient la déclaration extern de la variable.
  4. \n
  5. Tout autre fichier .cpp — inclut l'en-tête et utilise la variable.
  6. \n
\n\n

Exemple 1 : Partager un entier

\n\n

Imaginez que nous écrivions un jeu et voulions stocker un score global dans un fichier séparé. Voici comment faire correctement.

\n\n

Fichier : globals.cpp — ici vit la vraie variable :

\n
// globals.cpp\n#include "globals.h"\n\nint gameScore = 0;  // Définition : la mémoire est allouée ici
\n\n

Fichier : globals.h — la déclaration pour tous les autres :

\n
// globals.h\n#ifndef GLOBALS_H\n#define GLOBALS_H\n\nextern int gameScore;  // Déclaration : "cherche la définition dans un autre .cpp"\n\n#endif // GLOBALS_H
\n\n

Fichier : main.cpp — nous utilisons la variable :

\n
// main.cpp\n#include <iostream>\n#include "globals.h"\n\nvoid updateScore(int points) {\n    gameScore += points;  // Ça marche ! extern a donné l'accès\n}\n\nint main() {\n    gameScore = 100;\n    updateScore(50);\n    std::cout << "Score: " << gameScore << std::endl; // Affiche 150\n    return 0;\n}
\n\n

Fichier : display.cpp — un autre fichier qui a besoin d'accès :

\n
// display.cpp\n#include <iostream>\n#include "globals.h"\n\nvoid showScore() {\n    std::cout << "Current score: " << gameScore << std::endl;\n}
\n\n

Remarquez : gameScore est défini exactement une fois — dans globals.cpp. Partout ailleurs, nous utilisons extern int gameScore (via l'en-tête).

\n\n

Erreur fréquente n°1 : définition dans le fichier d'en-tête

\n\n

Les débutants écrivent souvent ceci dans un fichier .h :

\n
// MAUVAIS : ba                

Blogs

Book Recommendations