tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von deepthroat
ERLEDIGT
NEIN
ANTWORTEN
7
ZUGRIFFE
234
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    ibafluss ibafluss ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    168
    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 :
    1
    2
    3
    
    // First file
    #include <fstream>
    std::ofstream out("out.txt");

    Code :
    1
    2
    3
    4
    5
    6
    7
    
    // 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
     

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    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ß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #3
    ibafluss ibafluss ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    168
    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
     

  4. #4
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von ibafluss Beitrag anzeigen
    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:
    Code c:
    1
    2
    3
    
    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.
    Zitat Zitat von ibafluss Beitrag anzeigen
    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ß
    ibafluss bedankt sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  5. #5
    ibafluss ibafluss ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    168
    Ok vielen Dank
     

  6. #6
    ibafluss ibafluss ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    168
    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
     

  7. #7
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von ibafluss Beitrag anzeigen
    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.

    Zitat Zitat von ibafluss Beitrag anzeigen
    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ß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  8. #8
    ibafluss ibafluss ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    168
    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.
     

Ähnliche Themen

  1. Verständnis Problem
    Von dg87 im Forum PHP
    Antworten: 15
    Letzter Beitrag: 10.07.11, 18:13
  2. Static Verständnis Problem
    Von dg87 im Forum PHP
    Antworten: 1
    Letzter Beitrag: 07.06.11, 20:25
  3. Verständnis von Static
    Von Quai im Forum Coders Talk
    Antworten: 3
    Letzter Beitrag: 17.05.08, 12:55
  4. static und non static Problem :|
    Von Tsa im Forum Java
    Antworten: 3
    Letzter Beitrag: 07.01.06, 03:45
  5. verständnis PROBLEM
    Von Tageslicht im Forum PHP
    Antworten: 4
    Letzter Beitrag: 11.12.04, 10:43