Je lis "Think in C ++" et il vient d'introduire la extern
déclaration. Par exemple:
extern int x;
extern float y;
Je pense que je comprends le sens (déclaration sans définition), mais je me demande quand cela se révèle utile.
Quelqu'un peut-il donner un exemple?
c++
variable-declaration
Aslan986
la source
la source
extern
plusieurs reprises. Les outils Microsoft ont généré une erreur de lien pour les symboles manquants lorsque les tables d'un autre fichier source ont été définies uniquement. Le problème était que la table étaitconst
et le compilateur C ++ l'a promuestatic
dans l'unité de traduction. Voir, par exemple,ariatab.cpp
etkalynatab.cpp
.Réponses:
Cela est utile lorsque vous avez des variables globales. Vous déclarez l' existence de variables globales dans un en-tête, de sorte que chaque fichier source qui inclut l'en-tête le sache, mais il vous suffit de le «définir» une fois dans l'un de vos fichiers source.
Pour clarifier, using
extern int x;
indique au compilateur qu'un objet de typeint
appeléx
existe quelque part . Ce n'est pas le travail des compilateurs de savoir où il existe, il suffit de connaître le type et le nom pour qu'il sache comment l'utiliser. Une fois que tous les fichiers source ont été compilés, l'éditeur de liens résoudra toutes les références dex
la définition qu'il trouve dans l'un des fichiers source compilés. Pour que cela fonctionne, la définition de lax
variable doit avoir ce qu'on appelle un «lien externe», ce qui signifie essentiellement qu'elle doit être déclarée en dehors d'une fonction (à ce qui est généralement appelé «la portée du fichier») et sans lestatic
mot - clé.entête:
source 1:
source 2:
la source
Il est utile lorsque vous partagez une variable entre quelques modules. Vous le définissez dans un module et utilisez extern dans les autres.
Par exemple:
dans file1.cpp:
dans file2.cpp:
la source
global_int
trouve dans l'espace de noms global, si je devais l'utiliser dans file2.cpp dans une section d'espace de noms, je devrais l'étendre correctement? ienamespace XYZ{ void foo(){ ::global_int++ } };
abc.h
, il y a de fortes chances qu'elle soit définie dansabc.cpp
. Un bon IDE sera toujours utile, mais un code bien organisé est toujours une meilleure solution.extern
dans file2.cpp, peut toujours accéder àglobal_int
after include. pourquoi je dois l'avoir?Tout dépend du lien .
Les réponses précédentes ont fourni de bonnes explications sur
extern
.Mais je veux ajouter un point important.
Vous demandez à propos
extern
de C ++ pas en C et je ne sais pas pourquoi il n'y a pas de réponse mentionnant le cas quandextern
vient avecconst
C ++.En C ++, une
const
variable a un lien interne par défaut (pas comme C).Donc, ce scénario entraînera une erreur de liaison :
Source 1:
Source 2:
Cela doit être comme ceci:
Source 1:
Source 2:
la source
extern
définition? Vous pouvez le faire en imprimant la valeur de laglobal
source 2.extern
est omis dansconst int global = 255;
.Ceci est utile lorsque vous souhaitez avoir une variable globale. Vous définissez les variables globales dans un fichier source et les déclarez extern dans un fichier d'en-tête afin que tout fichier qui comprend ce fichier d'en-tête voit alors la même variable globale.
la source