Maison >développement back-end >C++ >Que se passe-t-il lors du fiasco des commandes d'initialisation statique en C ?

Que se passe-t-il lors du fiasco des commandes d'initialisation statique en C ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-11 02:05:09326parcourir

What Happens During Static Initialization Order Fiasco in C  ?

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;

Questions :

  1. Lors de la compilation de file1.cpp, le compilateur :

    • Allouer de l'espace de stockage pour y ?
    • Initialiser x ?
  2. Lors de la compilation de file2.cpp, le compilateur :

    • Alloue-t-il du stockage pour x ?
    • Initialise y ?
  3. 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") :

  1. 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.
  2. 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.
  3. 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn