Heim > Artikel > Backend-Entwicklung > Wie kann die ordnungsgemäße Initialisierung globaler Variablen in C mit Abhängigkeiten gewährleistet werden?
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!