C ++ definiert keine Reihenfolge für den Fall, dass globale Variablen während des Programmstarts erstellt werden. a
könnte zuerst initialisiert werden, bevor something
erzeugt wird, was das obige Problem verursachen würde. Wenn Sie beginnen, globale Variablen zu konstruieren, die von anderen globalen Variablen abhängen, die initialisiert werden, dann stoßen Sie auf die klassische statische Initialisierungsreihenfolge fiasco .
Eine einfache Möglichkeit, das obige Szenario zu beheben, besteht darin, something
statisch zu machen und in die Funktion create
zu verschieben.
Das garantiert, dass something
beim ersten Aufruf von create
erstellt wird.
Alle globalen Variablen werden vor der Eingabe von main () erstellt, aber ihre Reihenfolge der Konstruktion zwischen verschiedenen Übersetzungseinheiten wird nicht vom c ++ - Standard angegeben. Ihre Reihenfolge der Konstruktion innerhalb der gleichen Übersetzungseinheit ist in der Reihenfolge der Spezifikation.
Sie könnten etwas bilden, das vom Standard garantiert wird. Etwas wie das:
%Vor%Die Map wird beim ersten Aufruf der Funktion mymap () erstellt.
Die Reihenfolge, in der globale Variablen (dh Variablen im Namespacebereich) erstellt werden, lautet folgendermaßen:
Dies ist etwas, das Sprachen mit Modulen nicht leiden, aber leider ein häufiges Problem in C ++. Wenn Sie funtionlokale statische Variablen verwenden, kann bei der ersten Verwendung eine Initialisierung ausgelöst werden, die dieses Problem im Allgemeinen löst.
Beispiel für statische lokale:
%Vor%Tags und Links c++ initialization