Fiasco de l'ordre d'initialisation statique
Le « fiasco de l'ordre d'initialisation statique » (SIOF) fait référence à un problème potentiel qui peut survenir lors de l'utilisation de données statiques. membres dans les programmes C. Cette situation se produit lorsque plusieurs fichiers sources définissent des données membres statiques avec des dépendances circulaires.
Considérons 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
Question :
Basé sur les extraits de code donnés, pouvez-vous expliquer les étapes suivantes qui peuvent se produire lors de la compilation et liaison ?
- Dans file1.cpp, le compilateur alloue-t-il du stockage et initialise y ?
- Dans file1.cpp, le compilateur alloue-t-il du stockage pour x ?
- Dans file2.cpp, le compilateur alloue-t-il du stockage et initialise-t-il x ?
- Dans file2.cpp, est-ce que le compilateur alloue de l'espace de stockage pour y ?
- Pendant la liaison, si file2.o est initialisé en premier, x est-il initialisé avec une valeur de 0 ?
Réponse :
Selon le standard C (3.6.2 "Initialisation des objets non locaux"), les étapes suivantes se produire :
-
Étape 1 : initialisation à zéro : x et y sont initialisés à zéro avant toute autre initialisation.
-
Étape 2 : dynamique Initialisation : La norme ne précise pas quelle variable (x ou y) est initialisée en premier. L'une d'elles sera initialisée avec une valeur de 1, car elle accède à la valeur initialisée à zéro de l'autre variable.
-
Étape 3 : Initialisation dynamique de la deuxième variable : La variable restante sera initialisé dynamiquement, obtenant une valeur de 2.
- Par conséquent, la réponse à la cinquième question est non, x n'est pas initialisé avec une valeur de 0.
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!