Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann die ordnungsgemäße Initialisierung globaler Variablen in C mit Abhängigkeiten gewährleistet werden?

Wie kann die ordnungsgemäße Initialisierung globaler Variablen in C mit Abhängigkeiten gewährleistet werden?

Linda Hamilton
Linda HamiltonOriginal
2024-11-03 22:56:02691Durchsuche

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

C Globale Initialisierungsreihenfolge: Abhängigkeiten untersuchen

In C werden globale Variablen innerhalb einer Übersetzungseinheit normalerweise in der Reihenfolge initialisiert, in der sie deklariert werden. Allerdings kann es zu Verwirrung kommen, wenn die Initialisierungsreihenfolge über mehrere Übersetzungseinheiten hinweg betrachtet wird.

Anfängliches Problemszenario

Bedenken Sie den folgenden Code:

<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>

Mit Bei diesem Code lautet die erwartete Ausgabe:

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

Allerdings vertauscht man die Deklaration und Initialisierung von Dummy und globalFoo führt zu einer anderen Ausgabe:

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

Initialisierungsreihenfolge und Abhängigkeiten

Dieses Verhalten legt nahe, dass die Initialisierungsreihenfolge globaler Variablen Abhängigkeiten ignoriert. In diesem Fall versucht der Aufruf von Foo::addToGlobal() auf eine Methode von Foo zuzugreifen, bevor deren Konstruktor aufgerufen wurde.

Lösung: Sicherstellen einer korrekten Initialisierung

Um sicherzustellen, dass der Konstruktor von Foo aufgerufen wird, bevor Dummy initialisiert wird, können wir globalFoo vor Dummy in derselben Übersetzungseinheit definieren. Dies garantiert, dass globalFoo zuerst initialisiert wird, sodass addToGlobal() erfolgreich auf seine Methoden zugreifen kann.

Alternative Lösung: Statischer Initialisierungsschutz

Alternativ können wir einen statischen einführen Initialisierungsschutz innerhalb von Foo::addToGlobal():

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

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

pFoo->add();</code>

Diese Prüfung stellt sicher, dass der Zeiger pFoo wird vor dem Zugriff auf seine Methoden mit globalFoo initialisiert, wodurch die vorzeitige Verwendung von globalFoo wirksam verhindert wird.

Das obige ist der detaillierte Inhalt vonWie kann die ordnungsgemäße Initialisierung globaler Variablen in C mit Abhängigkeiten gewährleistet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn