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.

Était-ce utile?

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.

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