Frage

Noch eine weitere static Frage. Ich habe folgende lesen:

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.

War es hilfreich?

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

.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top