2016-07-01 7 views
0

Ich las this und ich kann von einem Szenario nicht denken, für die X::_x wird, bevor in der Datei X.cpp (vorausgesetzt, den Compiler behandelt X.h und X.cpp einer nach dem anderen)C++ statische Initialisierung Reihenfolge Fiasko passiert wann?

Kann jemand mir erklären, wie solches Szenario initialisiert verwendet werden könnte passieren?

+0

Es kann passieren, wenn Sie mehr als 1 Übersetzungseinheit haben. – drescherjm

+0

Haben Sie [10.14] (http://www.cs.technion.ac.il/users/yechiel/c++faq/static-init-order.html) dieser FAQ gelesen? –

Antwort

5

Statische Initialisierungsreihenfolge Fiasko passiert, wenn Sie mehrere Übersetzungseinheiten* die Verwendung statische Initialisierung haben, und einer der Initialisierungsroutinen Daten durch ein anderes erzeugt erfordern.

Wenn Sie nur einen einzigen Header und eine einzige Übersetzungseinheit haben, gilt die statische Initialisierungsreihenfolge fiasco nicht, da initialization order within the same unit is well defined (es folgt der Reihenfolge der Deklaration).

* das ist ein fantastischer Name für eine cpp-Datei.

+0

Ist das nicht eher ein Objekt, das durch einen einzigen Kompilierungslauf z.B. 'g ++ -c a.cc b.cc -o ab.o' würde eine einzelne Übersetzungseinheit ergeben? –

+1

@ W.F .: Nein, das sind zwei Übersetzungseinheiten. Ich denke, g ++ würde sie in die gleiche .o-Datei schreiben, die zweite klobberte die erste. Gemäß der Dokumentation "Da nur eine Ausgabedatei angegeben werden kann, ist die Verwendung von -o beim Kompilieren mehrerer Eingabedateien nicht sinnvoll, es sei denn, Sie erstellen eine ausführbare Datei als Ausgabe." –

+0

@ W.F. Es spielt keine Rolle, wenn Sie beide cc-Dateien auf einmal kompilieren: Aus der Sicht des C++ - Standards wird jede cc-Datei als separate Übersetzungseinheit betrachtet. – dasblinkenlight

0

Ich denke, es kann nicht passieren, nur mit dem Code auf der Seite, aber es kann mehr Code sein, verhält sich wie auf der Seite beschrieben. In einer dieser Dateien könnte man ein statisches Objekt vom Typ X:

// File X3.cpp 
#include "X.h" 

X x__; 

Nun, wenn:

  • der Standardkonstruktor der Klasse X ruft irgendeinemethode

    // File X2.cpp 
    
    X::X() { 
        someMethod(); 
    } 
    

und

  • x__ vor x_ initialisiert (was, oder auch nicht passieren kann, da sowohl statische Objekte sind in verschiedenen cpp-Dateien die Reihenfolge nicht definiert ist), bevor x_ initialisiert wurde aufgerufen wird

dann irgendeinemethode().