parola chiave static nel file di ore e il collegamento interno
-
28-09-2019 - |
Domanda
Ancora un'altra domanda static
.
Ho letto quanto segue:
- Quali sono le variabili statiche?
- e statico galleggia
- http://msdn.microsoft.com/en-us/library /s1sb61xd.aspx
E io ancora non riesco a capire il seguente comportamento:
Ho un unico file 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;
e due file cpp
:
// StaticTest1.cpp
#include "StaticTest.h"
int main () {
return 0;
}
E
// StaticTest2.cpp
#include "StaticTest.h"
L'output del programma è:
In A's ctor(1)
In A's ctor(2)
In A's dtor(1)
In A's dtor(0)
Ora, il costruttore di A
viene chiamato due volte, dal momento che il file h
è incluso due volte, e poiché un'istanza denominata A
di a
è dichiarata static
, ha il collegamento interno e il compilatore è felice.
Dal momento che il counter
è anche dichiarato statico, ma ha anche il collegamento interno, e mi aspetto che il suo valore non saranno condivise in due file cpp
--- ma l'output del programma implica il valore è condiviso, dal momento che conta fino a 2.
eventuali approfondimenti?
EDIT:
Tutte le risposte riguardo a ciò che è considerato un "buona programmazione abitudine" nel contesto di dichiarare variabili statiche in h
vs. cpp
file è anche accolto con favore.
Soluzione
Se StaticTest.h
è condivisa tra i file di origine differenza quindi si otterrà un comportamento indefinito.
Se si definisce un funzioni classe o linea in diverse unità di traduzione poi loro definizioni deve essere lo stesso (stessa sequenza di token) e, soprattutto, eventuali identificatori devono fare riferimento alla stessa entità (a meno che un oggetto const
con collegamento interno) come nella definizione in un'altra unità di traduzione.
violare questo perché counter
trovi collegamento interno così in diverse unità di traduzione l'identificatore nelle definizioni di funzione si riferisce ad un oggetto diverso.
Riferimento: C ++ 03 3.2 [basic.def.odr] / 5
.