mot-clé statique dans le fichier h et liaison interne
-
28-09-2019 - |
Question
Encore une autre question static
.
J'ai lu ce qui suit:
- Quelles sont les variables statiques?
- et flotte statique
- http://msdn.microsoft.com/en-us/library /s1sb61xd.aspx
Et je ne comprennent pas encore le comportement suivant:
J'ai un fichier h
:
// StaticTest.h
#include <stdio.h>
static int counter = 0;
struct A {
A () {
counter++;
printf("In A's ctor(%d)\n", counter);
}
~A () {
counter--;
printf("In A's dtor(%d)\n", counter);
}
};
static A a;
Et deux fichiers cpp
:
// StaticTest1.cpp
#include "StaticTest.h"
int main () {
return 0;
}
// StaticTest2.cpp
#include "StaticTest.h"
La sortie du programme est le suivant:
In A's ctor(1)
In A's ctor(2)
In A's dtor(1)
In A's dtor(0)
Maintenant, le constructeur de A
est appelé deux fois, puisque le fichier h
est inclus deux fois, et comme instance nommée la A
de a
est déclarée static
, il a une liaison interne et le compilateur est heureux.
Étant donné que le counter
est également déclarée statique, elle a aussi une liaison interne, et j'attendre à ce que sa valeur ne sera pas partagée dans les deux fichiers cpp
--- mais la sortie du programme implique la valeur est partagée, car elle compte jusqu'à 2.
des idées?
EDIT:
Toutes les réponses sur ce qui est considéré comme une « bonne habitude de programmation » dans le contexte de la déclaration des variables statiques dans les fichiers h
contre cpp
est également accueillie favorablement.
La solution
Si StaticTest.h
est partagé entre les fichiers source de différence, alors vous aurez un comportement non défini.
Si vous définissez une fonction de classe ou en ligne dans différentes unités de traduction alors leurs définitions doivent être identiques (même séquence de jetons) et, surtout, les identifiants doivent se référer à la même entité (sauf si un objet const
avec liaison interne) dans la définition dans une autre unité de traduction.
Vous violer parce counter
a une liaison interne ainsi dans différentes unités de traduction de l'identifiant dans les définitions de fonction fait référence à un autre objet.
Référence: C ++ 03 3.2 [basic.def.odr] / 5
.