Fiasko der statischen Initialisierungsreihenfolge
Das „statische Initialisierungsreihenfolge-Fiasko“ (SIOF) bezieht sich auf ein potenzielles Problem, das bei der Verwendung statischer Daten auftreten kann Mitglieder in C-Programmen. Diese Situation entsteht, wenn mehrere Quelldateien statische Datenelemente mit zirkulären Abhängigkeiten definieren.
Betrachten Sie das folgende Beispiel:
// file1.cpp
extern int y;
int x = y + 1;
// file2.cpp
extern int x;
int y = x + 1;
Frage:
Basierend Können Sie anhand der angegebenen Codeausschnitte die folgenden Schritte erläutern, die während der Kompilierung auftreten können? Verknüpfen?
- Ordnet der Compiler in Datei1.cpp Speicher zu und initialisiert y?
- Ordnet der Compiler in Datei1.cpp Speicher für x zu?
- Weist der Compiler in Datei2.cpp Speicher zu und initialisiert er x?
- In Datei2.cpp Weist der Compiler Speicher für y zu?
- Wenn beim Verknüpfen file2.o zuerst initialisiert wird, wird x dann mit einem Wert von 0 initialisiert?
Antwort:
Gemäß dem C-Standard (3.6.2 „Initialisierung nicht-lokaler Objekte“), Die folgenden Schritte finden statt:
-
Schritt 1: Nullinitialisierung: Sowohl x als auch y werden vor jeder anderen Initialisierung auf Null initialisiert.
-
Schritt 2: Dynamische Initialisierung: Der Standard gibt nicht an, welche Variable (x oder y) zuerst initialisiert wird. Eine davon wird mit dem Wert 1 initialisiert, da sie auf den mit Null initialisierten Wert der anderen Variablen zugreift.
-
Schritt 3: Dynamische Initialisierung der zweiten Variablen: Die verbleibende Variable wird dynamisch initialisiert und erhält einen Wert von 2.
- Daher lautet die Antwort auf die fünfte Frage Nein, x wird nicht mit einem Wert von 0 initialisiert.
Das obige ist der detaillierte Inhalt vonWas passiert beim Kompilieren und Verknüpfen im Fiasko der statischen C-Initialisierungsreihenfolge?. 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