Question

Encore une autre question static. J'ai lu ce qui suit:

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;
}

// StaticTest2.cpp
#include "StaticTest.h"

La sortie du programme est le suivant:

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, puisque le fichier h est inclus deux fois, et comme instance nommée la A de a est déclarée static, il a une liaison interne et le compilateur est heureux. Étant donné que le counter est également déclarée statique, elle a aussi une liaison interne, et j'attendre à ce que sa valeur ne sera pas partagée dans les deux fichiers cpp --- mais la sortie du programme implique la valeur est partagée, car elle compte jusqu'à 2.

des idées?

EDIT: Toutes les réponses sur ce qui est considéré comme une « bonne habitude de programmation » dans le contexte de la déclaration des variables statiques dans les fichiers h contre cpp est également accueillie favorablement.

Était-ce utile?

La solution

Si StaticTest.h est partagé entre les fichiers source de différence, alors vous aurez un comportement non défini.

Si vous définissez une fonction de classe ou en ligne dans différentes unités de traduction alors leurs définitions doivent être identiques (même séquence de jetons) et, surtout, les identifiants doivent se référer à la même entité (sauf si un objet const avec liaison interne) dans la définition dans une autre unité de traduction.

Vous violer parce counter a une liaison interne ainsi dans différentes unités de traduction de l'identifiant dans les définitions de fonction fait référence à un autre objet.

Référence: C ++ 03 3.2 [basic.def.odr] / 5

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top