static Verständnis Problem

ibafluss

Erfahrenes Mitglied
Hey Leute!

Bin grad am C++ lernen mit dem Buch "Thinking in C++" von Bruce Eckel. Da geht es gerade darum, dass es zu Problemen führen kann, bei mehreren Dateien extern zu verwenden, da man nicht weiß, welcher Quelltext zuerst kompiliert wird.
Beispiel war das Programm:

Code:
// First file
#include <fstream>
std::ofstream out("out.txt");

Code:
// Second file
#include <fstream>
extern std::ofstream out;
class Oof {
public:
  Oof() { std::out << "ouch"; }
} oof;

Und das funktioniert nur, wenn die erste Datei zuerst kompiliert wird.
Der Titel des Teiles lautet hier "static initialization dependency" und es wird die ganze Zeit von static-Objekten gesprochen. Welche Bedeutung von static ist hier gemeint? Im Code steht ja nirgends static?

Lg
 
Hi.

Erstmal ist nicht wirklich wichtig welche Datei zuerst kompiliert wird. Was man nicht weiß (weil es nicht festgelegt ist) welche statischen Objekte zuerst beim Laden des Programmes initialisiert werden (=> static initialization order fiasco). Das hat am ehesten etwas mit dem Linken zu tun.

"Statisch" in dem Zusammenhang bezieht auf die Lebenszeit des Objektes, es existiert die gesamte Laufzeit des Programmes über.

Gruß
 
Ja, da hab ich mich mal wieder unklar ausgedrückt ;)

Die statischen Objekte sind in diesem Fall statisch, weil sie global sind, hab ich das richtig verstanden? Und deshalb werden sie auch automatisch mit 0 initialisiert.

Lg
 
Die statischen Objekte sind in diesem Fall statisch, weil sie global sind, hab ich das richtig verstanden?
Ja. Das ist im Grunde das Gleiche wie innerhalb einer Funktion:
C:
void foo() {
  static z = 5;
}
Die lokale Variable wird initialisiert sobald die Funktion zum ersten Mal betreten wird. Bei einer globalen Variablen passiert das gleiche - nur ist ihre Sichtbarkeit "global" und lebt das ganze Programm.
Und deshalb werden sie auch automatisch mit 0 initialisiert.
Eine Begründung für die Initialisierung mit 0 ist es eigentlich nicht. Es wird vom C Standard vorgeschrieben.

Gruß
 
Aber mir leuchtet etwas immer noch nicht ein: Es kommt darauf an, welche statischen Objekte zuerst initialisiert werden. Ich habe ja nur ein statisches Objekt, das ist das out? Wo tritt den ein Problem auf, bzw. was ist denn genau mit dem Initialisieren von statischen Objekten gemeint? Zuerst werden sie mit 0 initialisiert, dann mit dem Wert in der ersten Datei, wie kann dann da ein Fehler auftreten?

Lg
 
Aber mir leuchtet etwas immer noch nicht ein: Es kommt darauf an, welche statischen Objekte zuerst initialisiert werden. Ich habe ja nur ein statisches Objekt, das ist das out? Wo tritt den ein Problem auf, bzw. was ist denn genau mit dem Initialisieren von statischen Objekten gemeint? Zuerst werden sie mit 0 initialisiert
Moment. Objekte werden natürlich nicht mit 0 initialisiert. Das gilt nur für intrinsische Datentypen.

dann mit dem Wert in der ersten Datei, wie kann dann da ein Fehler auftreten?
Der Fehler kann auftreten, wenn aus einem statischen Kontext heraus bereits auf ein (noch nicht) initialisiertes statischen Objekt zugegriffen wird.

In dem Beispiel von dir wird ein statisches Objekt der Oof Klasse angelegt, in dessen Konstruktor wird auf das statische out Objekt zugegriffen. Überlebenschance: 50:50.

Gruß
 
Das steht nämlich unter dem Beispiel: For all static objects, the linking-loading mechanism guarantees a static initialization to zero before the dynamic initialization specified by the programmer takes place.
 
Zurück