Heim > Backend-Entwicklung > C++ > 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
Freigeben: 2024-11-03 22:56:02
Original
711 Leute haben es durchsucht

 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>
Nach dem Login kopieren

Mit Bei diesem Code lautet die erwartete Ausgabe:

Foo::Foo()
Foo::addToGlobal() START
Foo::add()
Foo::addToGlobal() END
main()
Nach dem Login kopieren

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()
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage