Utilisation du mot clé ‘extern’ lors de la définition de la variable

Après avoir vu cette réponse, j’ai ce doute. Dans mon projet, j’ai vu quelques variables externes déclarées et définies comme ci-dessous:

fichier1.h

extern int a; 

fichier1.c

 extern int a=10; 

Mais dans le lien que j’ai mentionné, il est indiqué que, dans le fichier c, il devrait être défini comme suit:

 int a = 10; 

Est-ce que l’ajout de mots clés extern cours de la définition n’a également aucun but / signification? Ou est-ce important au fait?

Cela ne change pas le sens. extern n’a de sens que lorsque vous déclarez une variable. Définir une variable avec extern est identique car toutes les variables globales qui ne sont pas marquées comme static sont des symboles visibles par défaut pour l’éditeur de liens.

Notez que si vous ne voulez pas initialiser la variable, c’est-à-dire ne pas avoir la partie = 10 , le compilateur supposera extern int a est toujours une déclaration et non une définition . Dans le même sens, avoir int a globale est toujours une définition et pas seulement une déclaration .

Ça dépend. Dans ce cas, cela ne fait aucune différence, mais c’est possible.

Il y a deux problèmes ici: la définition par rapport à la déclaration et le couplage. Et C ++ ne les gère pas de manière orthogonale. En C ++, la déclaration d’une variable ou d’une référence est une définition si et seulement si ni le mot-clé extern ni une initialisation ne sont présents. (Notez que les règles sont différentes pour les fonctions, les types et les modèles.) Donc:

 extern int a; // not a definition int a; // definition extern int a = 42; // definition int a = 42; // definition 

Les règles indiquent que vous devez avoir exactement une définition. Vous devez donc placer une définition dans un fichier source et la déclaration dans un en-tête.

En ce qui concerne la liaison, un symbole déclaré comme variable ou une référence a une liaison externe s’il est déclaré dans la scope de l’espace de noms, s’il n’est pas déclaré static et s’il n’est pas const (ni constexpr en C ++ 11), ou constexpr a été déclaré extern . Le fait que const puisse donner un lien interne variable signifie parfois que l’ extern est nécessaire:

 int const a = 42; // internal linkage extern int const a = 42; // external linkage 

Notez que l’ extern ne doit pas nécessairement être sur la même déclaration:

 extern int const a; // declaration, in header... int const a = 42; // external linkage, because of // previous extern 

Pourtant, j’ai parfois eu besoin de l’ extern ; généralement parce que je veux utiliser une constante locale pour instancier un modèle. (Ceci n’est un problème que si le paramètre template prend un pointeur ou une référence. Vous pouvez instancier un template avec un paramètre int avec un int const a = 42; car le template est instancié avec la valeur 42, et non la variable a .)