Maison  >  Article  >  développement back-end  >  Comment garantir la bonne initialisation des variables globales en C avec dépendances ?

Comment garantir la bonne initialisation des variables globales en C avec dépendances ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-03 22:56:02630parcourir

 How to Guarantee Proper Initialization of Global Variables in C   with Dependencies?

Ordre global d'initialisation en C : exploration des dépendances

En C, les variables globales au sein d'une unité de traduction sont généralement initialisées dans l'ordre dans lequel elles sont déclarées. Cependant, une confusion peut survenir lors de l'examen de l'ordre d'initialisation sur plusieurs unités de traduction.

Scénario de problème initial

Considérez le code suivant :

<code class="cpp">struct Foo {
    Foo() { printf("Foo::Foo()\n"); }
    void add() { printf("Foo::add()\n"); }
    static int addToGlobal() {
        globalFoo.add();
        return 0;
    }
};

Foo globalFoo;

int dummy = Foo::addToGlobal();

int main() { printf("main()\n"); return 0; }</code>

Avec ce code, le résultat attendu est :

Foo::Foo()
Foo::addToGlobal() START
Foo::add()
Foo::addToGlobal() END
main()

Cependant, l'échange de la déclaration et de l'initialisation de dummy et globalFoo donne un résultat différent :

Foo::addToGlobal() START
Foo::add()
Foo::addToGlobal() END
Foo::Foo()
main()

Ordre d'initialisation et dépendances

Ce comportement suggère que l'ordre d'initialisation des variables globales ignore les dépendances. Dans ce cas, l'appel à Foo::addToGlobal() tente d'accéder à une méthode de Foo avant que son constructeur n'ait été appelé.

Solution : garantir une initialisation correcte

Pour garantir que le constructeur de Foo est appelé avant l'initialisation de dummy, nous pouvons définir globalFoo avant dummy dans la même unité de traduction. Cela garantit que globalFoo sera initialisé en premier, permettant à addToGlobal() d'accéder avec succès à ses méthodes.

Solution alternative : Static Initialization Guard

Alternativement, nous pouvons introduire un static Initialization Guard

<code class="cpp">static Foo* pFoo = nullptr;

if (pFoo == nullptr) {
    pFoo = &globalFoo;
}

pFoo->add();</code>

Alternativement, nous pouvons introduire un static garde d'initialisation dans Foo::addToGlobal():

Cette vérification garantit que le pointeur pFoo est initialisé sur globalFoo avant d'accéder à ses méthodes, empêchant efficacement l'utilisation prématurée de globalFoo.

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