Pourquoi il n'est pas nécessaire de décorer un "const char *" avec "extern" lors du partage sur plusieurs fichiers
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
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.