statique vs non-statique des variables dans l'espace de noms
J'ai un espace de noms foo
qui contient un entier bar
, a déclaré alors...
foo.h:
namespace foo {
int bar;
}
Maintenant, si je comprend foo.h
dans un seul fichier, cela fonctionne bien. Mais un problème se pose lorsque je inclure foo.h
à partir de deux fichiers ou plus: j'obtiens une erreur de l'éditeur de liens. J'ai compris que si je déclare bar
comme static
, je peux inclure foo.h
dans plus d'un fichier. Cela me semble étrange, car je n'étais pas au courant que l'on peut déclarer une variable statique à l'intérieur d'un espace de noms. (qu'est que cela veut dire?)
Pourquoi ce travail? Et surtout, pourquoi n'est pas il travail sans static
? Ce n' static
dire lorsqu'utilisé dans une namespace
?
Vous devez vous connecter pour publier un commentaire.
Il y a plusieurs significations
static
dans des contextes différents. Dans ce contexte, il signifie que la variable a une liaison interne, et donc chaque unité de traduction qui comprend que la tête est propre copie de la variable.Note que bien que ce sera le silence de l'éditeur de liens d'erreur, il le fera entretien d'un
foo::bar
variable pour chacun des fichiers objets générés (modifications ne seront pas visibles à travers les différents fichiers objets).Si vous ne voulez qu'une seule variable, vous devez le déclarer comme
extern
dans l'en-tête et de fournir une définition unique dans une unité de traduction.Lorsque vous déclarez une variable comme
static
, cela signifie que ses champ d'application est limité à l'unité de traduction seulement. Sansstatic
la portée est mondiale.Lorsque vous déclarez une variable comme
static
à l'intérieur d'un .h fichier (à l'intérieur ou sansnamespace
; n'a pas d'importance), et inclure que les fichiers d'en-tête différents .fichiers cpp, lestatic
variable devient localement étendue de chacun des.cpp
fichiers.Alors maintenant, chaque .fichier cpp qui comprend que l'en-tête va avoir sa propre copie de cette variable.
Sans
static
mot-clé le compilateur va générer une seule copie de cette variable, de sorte que dès que vous incluez le fichier d'en-tête dans plusieurs .rpc fichiers de l'éditeur de liens se plaignent de multiples définitions.Le problème est causé par le fait d'avoir plus d'une définition de la variable. Les définitions dans les différentes unités de traduction conflit les uns avec les autres, tout comme plusieurs non en ligne des définitions de fonction ne fonctionne pas.
Lorsque vous faites la variable statique que vous donnez à la variable de liaison interne, de sorte que chaque unité de traduction dispose de sa propre copie indépendante.
Ce que vous avez probablement fait envie est de ne mettre que la déclaration dans un en-tête (à l'aide extern) et ensuite mettre la définition dans un fichier d'implémentation.
Également noter que
const int
à l'espace de noms (global) champ d'application en C++ astatic
ajouté implicitement par défaut: Définir des variables constantes dans l'en-tête C++Afin de mieux comprendre ce qui se passe, faire un
readelf
sur les intermédiaires objet ELF des fichiers de la compilation, et vous verrez clairement les symboles sont définis deux fois ou pas. Voici un exemple détaillé: Ce n' "statique" dans C?