Encore une autre static
question. J'ai lu ce qui suit:mot-clé statique dans le fichier h et le lien interne
- What are static variables?
- file scope and static floats
- 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;
}
Et:
// StaticTest2.cpp
#include "StaticTest.h"
La sortie du programme est:
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, depuis le h
fichier est inclus deux fois, et puisque l'instance A
nommée a
est déclarée static
, elle a un lien interne et le compilateur est heureux. Comme le counter
est également déclaré statique, il a également une liaison interne, et je suppose que sa valeur ne sera pas partagée dans les deux fichiers cpp
--- mais la sortie du programme implique que la valeur est partagée, car elle compte jusqu'à 2
des idées?
EDIT: Toutes les réponses concernant ce qui est considéré comme une « bonne habitude de programmation » dans le contexte de la déclaration des variables statiques dans h
par rapport à cpp
fichiers est également accueillie favorablement.
Je veux * * dire quelque chose au sujet des détails de mise en œuvre et sur les valeurs statiques initialisées à la compilation versus valeurs statiques initialisées exécution, mais je ne suis pas sûr de l'afficher comme réponse. Essayez de ne pas initialiser 'counter' et de l'initialiser dans' main() '. –
@ Benoit Thiery: C'est le code source complet. –
@ Ignacio Vazquez-Abrams: de la page MSDN: "Lorsque vous déclarez une variable, la variable a une durée statique et le compilateur l'initialise à 0 sauf si vous spécifiez une autre valeur" –