Question

Disons que nous avons deux unités de compilation comme suit:

// a.cpp
extern int value2;
int value1 = value2 + 10;

// b.cpp
extern int value1;
int value2 = value1 + 10;

Quand je l'ai essayé sur VC2010, il initialise value1 et value2 à zéro en premier.ne sont pas les deux value1 et value2 dynamiquement initialisé et d'initialisation par défaut ne s'applique pas sur eux?

Merci,

Était-ce utile?

La solution

3.6.2/1 dit que "les Objets statiques durée de stockage (3.7.1) doit être initialisé à zéro (8.5) avant toute autre initialisation a lieu".

Oui tu as raison, ils ne sont pas par défaut-initialisé.Mais ils sont initialisé à zéro, ce qui en fait pour int c'est la même chose.Pour un type de classe ce n'est pas nécessairement la même chose.

Cela dit, je ne suis pas en promettant le comportement ici est simplement que l'ordre de l'initialisation n'est pas spécifié, et donc qu'une variable se termine comme 10 et le 20, mais indéterminé qui est qui.Il peut être indéfini pour d'autres motifs, mais je ne peux pas penser à tout.

Autres conseils

Chaque variable globale est d'abord initialisé à zéro, avant tous les autres initialisations se produire.
Ce comportement est décrit sous la 3.6.2 [basic.start.init] / 2:

Les Variables statiques de durée de stockage thread ou la durée de stockage doit être initialisé à zéro avant toute autre initialisation a lieu.

(C'est du C++0x FDIS, mais je crois que le C++98 standard dit la même chose.)

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