Domanda

Ancora un'altra domanda static. Ho letto quanto segue:

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.

È stato utile?

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

.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top