2012-12-04 9 views
10

Ich weiß, dass globale Variablen in Deklarationsreihenfolge für die gleiche Kompilierungseinheit erstellt werden und die Erstellungsreihenfolge nicht zwischen mehreren Kompilierungseinheiten definiert ist.Wenn statische globale Variable in C++ erstellt werden

Ich habe vor einiger Zeit gelesen, dass globale Variablen erstellt werden, bevor irgendein Code aus der Übersetzungseinheit, in der sie definiert sind, aufgerufen wird. Ist das durch den Standard definiert?

Beispiel:

file1.cpp

int f1v1 = f1_1(); 
int f1v2 = f1_2(); 

void f1(){...} 

int f1_1(){...} 
int f1_2(){...} 

file2.cpp

static int f2v1 = f2_1(); 
static int f2v2 = f2_2(); 

int f2_1(){...} 
int f2_2(){...} 

main.cpp

#include "file1.h" 
#include "file2.h" 

int main() 
{ 
    f1(); 

    return 0; 
} 

Ist in diesem Fall von der Norm gewährleistet, dass f1_1() heißt vor f1_2() und vor f1()? Wird vom Standard garantiert, dass f2_1() und f2_2() überhaupt aufgerufen werden, da keine in der Datei2.cpp definierte Funktion aufgerufen wird und f2v1 und f2v2 außerhalb der Datei2.cpp nicht sichtbar sind?

EDIT:

Ist das Verhalten von der Norm festgelegt, wenn file1.cpp in lib1 kompiliert und file2.cpp wird in lib2 zusammengestellt?

+0

Sie können dies finden http://stackoverflow.com/questions/12321401/ dynamic-initialization nützlich – hmjd

+0

Hinweis: ob 'static' oder nur die * linkage * der Variablen betrifft, ist ihre Initialisierung identisch. –

+0

@MatthieuM. Ich wollte klarstellen, dass die Variablen nicht verwendet werden (Zugriff von anderem Ort) – Felics

Antwort

4

Basierend auf [basic.start.init]:

f1_1() vor f1_2() (Abs.2 auszuführen garantiert: „Variablen mit geordneten Initialisierung innerhalb einer einzelnen Übersetzungseinheit definiert sind, in der Reihenfolge ihrer Definitionen initialisiert werden in der Übersetzungseinheit. ").

Beide werden garantiert ausgeführt, bevor (Absatz 4: "Wenn die Initialisierung auf einen Zeitpunkt nach der ersten Anweisung von main verschoben wird, soll es vor der ersten odr-Verwendung (3.2) einer Funktion auftreten oder Variable, die in derselben Übersetzungseinheit wie die zu initialisierende Variable definiert ist. ").

über f2_1() und f2_2() [basic.stc.static] Abs.2 sagt: „Wenn eine Variable mit statischer Speicherdauer der Initialisierung oder eine destructor mit Nebenwirkungen hat, so hat er nicht einmal beseitigt werden, wenn er nicht benutzt zu sein scheint, ... ". Dies würde bedeuten, dass sie garantiert aufgerufen werden, wenn sie Nebenwirkungen enthalten.

0

Wenn ich Ihre Frage richtig verstehe, garantiert C++ die Initialisierungsreihenfolge der Variablen nach Deklaration innerhalb einer Kompilierungseinheit (d. H. Eine cpp-Datei). Die Reihenfolge der Initialisierung über Kompilierungseinheiten ist nicht definiert.

Im Prozess der Zusammenstellung würden die f2_* Funktionen nach der Norm genannt werden, obwohl Funktionen in file2.cpp nicht ran werden. Aber wenn der Compiler schlau genug ist, kann er sie vollständig weglassen, wenn er feststellt, dass das resultierende Programm so wirken würde, als ob es dem Standard entsprochen hätte. (d.h.wenn es über den Schatten des Zweifels hinaus garantieren kann, dass es keinen Unterschied im Verhalten zwischen einem Programm mit und einem Programm geben würde, ohne dass diese Funktionen aufgerufen werden)

Verwandte Themen