Pourquoi il n'est pas nécessaire de décorer un "const char *" avec "extern" lors du partage sur plusieurs fichiers

StackOverflow https://stackoverflow.com//questions/24043974

  •  21-12-2019
  •  | 
  •  

Question

En lisant des livres C++, j'ai appris que pour partager une variable/objet const sur plusieurs fichiers, nous devons définir la variable const une fois dans l'un des fichiers et la déclarer dans chaque fichier source où elle est utilisée.Par exemple,

Dans file1.cpp, nous définissons globalement une variable const int comme

extern const int ca = 100;

Dans file2.cpp où nous l'utilisons, nous déclarons cette variable comme

extern const int ca;

La convention ci-dessus est parfaitement logique pour moi.Cependant, lorsqu'il s'agit d'un pointeur const char, nous n'avons pas besoin de le définir à l'aide de extern, et il peut très bien être partagé entre plusieurs fichiers.Pourquoi une telle chose arrive-t-elle ?Par exemple,

Dans file1.cpp, nous définissons globalement une variable de pointeur const char comme

const char *cstr = "hello";

Dans file2.cpp où nous l'utilisons, nous déclarons cette variable comme

extern const char *cstr;

Pour rendre ma question plus précise, pourquoi cstr peut-il être utilisé dans file2.cpp même s'il n'est pas décoré de « extern » dans file1.cpp ?

Merci beaucoup

Était-ce utile?

La solution

Le problème est celui du lien.Lorsque vous définissez une variable dans la portée de l'espace de noms et qu'il n'y a pas de déclaration précédente qui établit la liaison, la liaison externe si l'objet n'est pas constant, interne si c'est le cas.Alors quand tu écris :

int const ca = 100;

Dans un fichier source, la liaison sera interne et l'entité (la variable) ca fait référence à sera unique à cette unité de traduction.Si tu avais écrit :

int ca = 100;

le lien serait externe, donc un

extern int ca;

dans une autre unité de traduction ferait référence à la même variable.

Et bien sûr, quand vous écrivez :

char const* cstr = "hello";

Vous définissez un pointeur, qui n'est pas const (bien qu'il pointe vers const).

Bien sûr, normalement, vous déclarez les variables dans un en-tête, avec extern, il y aurait donc une déclaration précédente lorsque vous définissez les variables, et c'est la première déclaration qui établit le lien.

Autres conseils

externe est utilisé pour que cela explique que la déclaration "externe const char * cstr;"est une déclaration et non une définition, CSTR est définie ailleurs.Si vous avez fait "const char * cstr;"Le compilateur interpréterait cela comme une définition et vous vous retrouveriez avec 2 variables CSTR.

Si vous appliquez externe sur "const char * cstr=" bonjour ";"Je suppose que le compilateur l'ignore parce que l'initialisation signifie que vous définissez réellement la variable.

Plus ici: http://fr.wikipedia.org/wiki/external_variable

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top