Schlüsselwort static in h-Datei und interne Bindung
-
28-09-2019 - |
Frage
Noch eine weitere static
Frage.
Ich habe folgende lesen:
- Was sind statische Variablen?
- Datei Umfang und statische schwimmt
- http://msdn.microsoft.com/en-us/library /s1sb61xd.aspx
Und ich immer noch nicht das folgende Verhalten zu verstehen:
Ich habe eine h
-Datei:
// 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;
Und zwei cpp
Dateien:
// StaticTest1.cpp
#include "StaticTest.h"
int main () {
return 0;
}
Und:
// StaticTest2.cpp
#include "StaticTest.h"
Die Ausgabe des Programms ist:
In A's ctor(1)
In A's ctor(2)
In A's dtor(1)
In A's dtor(0)
Nun wird A
Konstruktor zweimal aufgerufen, da die h
Datei zweimal enthalten ist, und da A
die Instanz mit dem Namen a
static
deklariert wird, hat es interne Bindung und der Compiler ist glücklich.
Da die counter
auch statisch deklariert wird, hat es auch interne Bindung, und ich würde erwarten, dass es den Wert nicht in den beiden cpp
Dateien geteilt werden --- aber das Programm Ausgabe impliziert wird der Wert geteilt, da es bis 2 zählt aufwärts.
irgendwelche Erkenntnisse?
EDIT:
Jede Antwort in Bezug auf, was als eine „gute Programmier Gewohnheit“ im Zusammenhang mit der Erklärung der statischen Variablen in h
vs. cpp
Dateien wird auch begrüßt.
Lösung
Wenn StaticTest.h
zwischen Differenz Quelldateien geteilt wird, dann werden Sie nicht definiertes Verhalten bekommen.
Wenn Sie eine Klasse oder Inline-Funktionen in verschiedenen Übersetzungseinheiten definieren dann ihre Definitionen müssen die gleiche (gleiche Folge von Token) und, entscheidend, alle Kennungen der gleichen Einheit beziehen müssen (es sei denn, ein const
Objekt mit interner Bindung) als in der Definition in einer anderen Übersetzungseinheit.
Sie verletzen, weil counter
interne Bindung hat so in verschiedenen Übersetzungseinheiten die Kennung in den Funktionsdefinitionen bezieht sich auf ein anderes Objekt.
Referenz: C ++ 03 3.2 [basic.def.odr] / 5
.