L'énigme du « fiasco de l'ordre d'initialisation statique » dévoilée
Le tristement célèbre « fiasco de l'ordre d'initialisation statique » (SIOF) survient lorsque plusieurs fichiers dans un programme C contiennent des variables statiques qui dépendent les uns sur les autres pour l'initialisation. Prenons l'exemple suivant :
// file1.cpp
extern int y;
int x = y + 1;
// file2.cpp
extern int x;
int y = x + 1;
Copier après la connexion
Questions :
-
Lors de la compilation de file1.cpp, le compilateur :
- Allouer de l'espace de stockage pour y ?
- Initialiser x ?
-
Lors de la compilation de file2.cpp, le compilateur :
- Alloue-t-il du stockage pour x ?
- Initialise y ?
-
Lors de la liaison de file1.o et file2.o, si file2.o est initialisé en premier, est-ce que :
- x reçoit une valeur initiale de 0 ?
- x reste non initialisé ?
Réponses :
Selon la norme C (3.6.2 "Initialisation d'objets non locaux") :
-
a. Le compilateur pas alloue de stockage pour y.
b. Le compilateur alloue de l'espace de stockage pour x mais ne pas initialise it.
-
a. Le compilateur pas alloue de l'espace de stockage pour x.
b. Le compilateur alloue de l'espace de stockage pour y mais le fait pas initialiser il.
-
a. x reçoit une valeur initiale de 0.
b. x ne fait pas rester non initialisé.
Explication :
-
Étape 1 : x et y sont initialisés à zéro avant toute autre initialisation.
-
Étape 2 : Soit x soit y sont initialisés dynamiquement (standard ne précise pas lequel). La variable initialisée reçoit la valeur 1, car l'autre variable est initialisée à zéro.
-
Étape 3 : L'autre variable est ensuite initialisée dynamiquement, recevant la valeur 2.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!