C'est tout à propos de la liaison.
Les réponses précédentes ont fourni de bonnes explications sur extern
.
Mais je veux ajouter un point important.
Vous parlez de extern
en C++, pas en C, et je ne sais pas pourquoi il n'y a pas de réponse mentionnant le cas où extern
est accompagné de const
en C++.
En C++, une variable const
a une liaison interne par défaut (contrairement à C).
Ce scénario provoquera une erreur de liaison :
Source 1 :
const int global = 255; //mauvaise façon de définir une variable constante globale en C++
Source 2 :
extern const int global; //déclaration
Il faut que ce soit comme ça :
Source 1 :
extern const int global = 255; //définition d'une variable constante globale en C++
Source 2 :
extern const int global; //déclaration
1 votes
J'ai dû fournir une définition avec
extern
à plusieurs reprises. Les outils Microsoft ont produit une erreur de lien pour des symboles manquants lorsque les tables dans un autre fichier source étaient seulement définies. Le problème était que la table étaitconst
et que le compilateur C++ l'a promue enstatic
dans l'unité de traduction. Voir, par exemple,ariatab.cpp
etkalynatab.cpp
.4 votes
Et je pense que la réponse de Nik est la bonne car il semble être le seul à avoir répondu à une question sur C++. Tous les autres semblent avoir digressé vers une question sur C.
4 votes
À partir de C++17,
inline
peut être une meilleure façon d'accomplir ce que vous voulez faire avecextern
. Avecinline
, vous pouvez définir des variables globales dans les en-têtes et ne pas vous soucier des problèmes de définitions multiples. stackoverflow.com/questions/38043442/…0 votes
Voir aussi: Comment appeler une fonction statique dans un fichier source C à partir d'un autre fichier source C?. J'ai récemment ajouté une réponse détaillée ici où je montre de nombreux exemples d'utilisation de
extern
et j'en parle en détail.