Variable statique dans un fichier d'en-tête
-
15-11-2019 - |
Question
La variable statique a une portée de fichier. Dites que j'ai deux fichiers suivants:
- fichier1.h
- file1.cpp
- fichier2.h
- file2.cpp
J'ai déclaré une variable statique dire static int Var1
dans les deux fichiers d'en-tête. Tous les deux file1.h
et file2.h
sont inclus dans main.cpp
dossier.
Je l'ai fait car la variable statique aura la portée des fichiers afin qu'elle ne se confronte pas. Mais après la compilation, j'ai trouvé qu'il montrait un conflit.
Maintenant, la variable statique se comporte comme un extern
variable. D'un autre côté, si je déclare la variable statique dans les deux fichiers .cpp, il compile bien.
Je ne peux pas comprendre ce comportement.
Tout corps peut-il expliquer comment la portée et le lien fonctionnent dans ce scénario.
La solution
Les variables statiques sont locales à l'unité de compilation. Une unité de compilation est essentiellement un .cpp
dossier avec le contenu du .h
fichier inséré à la place de chaque #include
directif.
Maintenant, dans une unité de compilation, vous ne pouvez pas avoir deux variables globales avec le même nom. C'est ce qui se passe dans votre cas: main.cpp
comprend file1.h
et file.h
, et chacun des deux en-têtes définit le sien Var1
.
Si logiquement, ce sont deux variables distinctes, donnez-leur des noms différents (ou placez-les dans des espaces de noms différents).
Si ce sont la même variable, déplacez-la dans un fichier d'en-tête séparé, var1.h
, et inclure var1.h
à la fois file1.h
et file2.h
, sans oublier le #include garde dans var1.h
.
Autres conseils
Les variables statiques ont une portée de l'unité de traduction (généralement un .c
ou .cpp
fichier), mais un #include
La directive copie simplement le texte d'un fichier verbatim et ne crée pas une autre unité de traduction. Après le prétraitement, ceci:
#include "file1.h"
#include "file2.h"
Se transformera en ceci:
/* file1.h contents */
static int Var1;
/* file2.h contents */
static int Var1;
Ce qui, comme vous le savez, n'est pas valide.
En supposant une variable statique static int Var1
est à la portée mondiale des deux en-têtes et comprenait les deux en-têtes dans main.cpp
. Maintenant, d'abord le pré-processeur copie le contenu des fichiers inclus dans le main.cpp
. Depuis, à main.cpp
il y a Var1
Déclaré deux fois à la même portée, une erreur de déclaration multiple se produira. (c'est-à-dire, un copié de file1.h
Et l'autre forme file2.h
par le pré-processeur)
Chaque fichier source est compilé individuellement. Maintenant, lorsque vous déclarez séparément dans leurs fichiers source, chaque fichier source n'est pas au courant de l'existence de l'autre variable statique présente dans l'autre fichier source portant le même nom. Ainsi, le compilateur ne signale pas d'erreur. Vous pouvez le marquer comme externe, si vous voulez qu'une variable soit partagée entre les fichiers source.