Forum: Mikrocontroller und Digitale Elektronik Reihenfolge Initialisierung von static Membern


von Entwickler (Gast)


Lesenswert?

Ich habe in zwei Klassen jeweils ein statisches Objekt, welche ich in 
zwei unterschiedlichen .cpp Dateien initialisier. Die main() befindet 
sich in einer dritten .cpp Datei.

Nun ist meine Frage, in welcher Reihenfolge werden diese initialisiert?

von EAF (Gast)


Lesenswert?

Entwickler schrieb:
> Ich habe in zwei Klassen jeweils ein statisches Objekt, welche ich in
> zwei unterschiedlichen .cpp Dateien initialisier.

Das haut dir der Linker um die Ohren.

Also nein, deine Situation MUSS eine andere sein.

von Entwickler (Gast)


Lesenswert?

Header a.hpp
1
class A{
2
  static int x;
3
};

Header b.hpp
1
class B{
2
  static int y;
3
};

Source a.cpp
1
int A::x = 0;

Source b.cpp
1
int B::y = 0;

von W.S. (Gast)


Lesenswert?

Entwickler schrieb:
> Ich habe in zwei Klassen jeweils ein statisches Objekt, welche ich in
> zwei unterschiedlichen .cpp Dateien initialisier.

Wozu so ein krummes Konstrukt überhaupt andenken?

Normalerweise nimmt man Objekte für Zeugs, was zwar ein individuelles 
Innenleben haben kann, aber von außen für alle derartigen Objekte gleich 
aussieht und gleich funktioniert. Beispiel: grafische Elemente auf dem 
Display. Das eine ist ein Kringel, das andere ein Kreuzel oder so 
ähnlich. Sowas wird beim Instantiieren aufgesetzt und das erfolgt in der 
Datei, die diese Objektklasse definiert. Fertig.

W.S.

von N00B (Gast)


Lesenswert?

Entwickler schrieb:
> Header a.hpp
> class A{
>   static int x;
> };
>
> Header b.hpp
> class B{
>   static int y;
> };
>
> Source a.cpp
> int A::x = 0;
>
> Source b.cpp
> int B::y = 0;

Iirc ist das undefiniert, müsste von linker abhängen

von Mikro 7. (mikro77)


Lesenswert?

Entwickler schrieb:
> Nun ist meine Frage, in welcher Reihenfolge werden diese initialisiert?

https://stackoverflow.com/questions/1005685/c-static-initialization-order

Am besten also wrappen.

von N00B (Gast)


Lesenswert?

Wobei die Reihenfolge nur bei Konstruktoreb überhaupt eine Rolle spielt. 
Globale Variablen werden intialisiert, bevor dein Programm überhaupt 
startet; daher hat die Reihenfolge keinen Effekt.

von Andreas M. (amesser)


Lesenswert?

Entwickler schrieb:
> Nun ist meine Frage, in welcher Reihenfolge werden diese initialisiert?

Das kommt darauf an in welcher Reihenfolge der Linker den Code bindet. 
U.a spielt die Reihenfolge der Argumente des Linkers eine Rolle. Das 
Problem umgeht man in dem man eine statische Memberfunktion definiert, 
die man eine Referenz auf ein in der Funktion definierte statische 
Instanz zurückliefern lässt.

von Mombert H. (mh_mh)


Lesenswert?

Entwickler schrieb:
> Nun ist meine Frage, in welcher Reihenfolge werden diese initialisiert?
Das ist undefiniert. Besorg dir ein ordentliches C++ Buch. Da wird 
erklärt, wie man mit so einer Situation umgeht.

W.S. schrieb:
> Entwickler schrieb:
>> Ich habe in zwei Klassen jeweils ein statisches Objekt, welche ich in
>> zwei unterschiedlichen .cpp Dateien initialisier.
>
> Wozu so ein krummes Konstrukt überhaupt andenken?
>
> Normalerweise nimmt man Objekte für Zeugs, was zwar ein individuelles
> Innenleben haben kann, aber von außen für alle derartigen Objekte gleich
> aussieht und gleich funktioniert. Beispiel: grafische Elemente auf dem
> Display. Das eine ist ein Kringel, das andere ein Kreuzel oder so
> ähnlich. Sowas wird beim Instantiieren aufgesetzt und das erfolgt in der
> Datei, die diese Objektklasse definiert. Fertig.
>
> W.S.

Was genau willst du damit sagen?

von EAF (Gast)


Lesenswert?

N00B schrieb:
> Iirc ist das undefiniert, müsste von linker abhängen

Nein!
Die statischen Klasseneigenschaften sind völlig unabhängig voneinander 
und klar definiert.
Es gibt also kein konkurrierendes Verhalten.

von Mikro 7. (mikro77)


Lesenswert?

N00B schrieb:
> Wobei die Reihenfolge nur bei Konstruktoreb überhaupt eine Rolle spielt.
> Globale Variablen werden intialisiert, bevor dein Programm überhaupt
> startet; daher hat die Reihenfolge keinen Effekt.

Es gibt Konstruktionen wo Funktionen bereits vor main aufgerufen werden.

von EAF (Gast)


Lesenswert?

Nachtrag:
Damit ist die Reihenfolge auch völlig egal.
Irrelevant.

von N00B (Gast)


Lesenswert?

Mikro 7. schrieb:
> N00B schrieb:
>
>> Wobei die Reihenfolge nur bei Konstruktoreb überhaupt eine Rolle spielt.
>> Globale Variablen werden intialisiert, bevor dein Programm überhaupt
>> startet; daher hat die Reihenfolge keinen Effekt.
>
> Es gibt Konstruktionen wo Funktionen bereits vor main aufgerufen werden.

Ich habe mich etwas unklar ausgedrückt: Variablen (im Sinne von int, 
char, …) werden iirc im Startup initialisiert, da ist die Reihenfolge 
egal (technisch gibt es eine).

Konstruktoren von Objekten werden vor Main() mit einer Reihenfolge 
abhängig davon, was der linker so treibt, aufgerufen.

von N00B (Gast)


Lesenswert?

EAF schrieb:
> N00B schrieb:
>
>> Iirc ist das undefiniert, müsste von linker abhängen
>
> Nein!
> Die statischen Klasseneigenschaften sind völlig unabhängig voneinander
> und klar definiert.
> Es gibt also kein konkurrierendes Verhalten.

?

Nur weil es nichts gibt, was im dem Beispiel von der Reihenfolge 
abhängen könnte, heißt es nicht, dass es keine Reihenfolge gibt; ein 
Speicherbereich wird halt zuerst beschrieben (auf den Plattformen, die 
ich kenne).

von N00B (Gast)


Lesenswert?

Entwickler schrieb:
> Header a.hpp
> class A{
>   static int x;
> };
>
> Header b.hpp
> class B{
>   static int y;
> };
>
> Source a.cpp
> int A::x = 0;
>
> Source b.cpp
> int B::y = 0;

Btw: das Beispiel wiederspricht sich mit deiner ursprünglichen Frage, 
wie ich gerade gemerkt habe, ints sind keine Objekte (und führen die 
Frage ad absurdum)

von Mombert H. (mh_mh)


Lesenswert?

N00B schrieb:
> Btw: das Beispiel wiederspricht sich mit deiner ursprünglichen Frage,
> wie ich gerade gemerkt habe, ints sind keine Objekte (und führen die
> Frage ad absurdum)

A::x ist ein Objekt mit Typ int.

von Mikro 7. (mikro77)


Lesenswert?

N00B schrieb:
> ...
1
/*global*/ int i = f() ;

Wenn nun f() auf eine globale Variable aus einer anderen Translation 
Unit zugreift, dann kann es durchaus sein, dass diese dort noch nicht 
initialisiert wurde.

von N00B (Gast)


Lesenswert?

N00B schrieb:
> Entwickler schrieb:
>
>> Header a.hpp
>> class A{
>> static int x;
>> };
>> Header b.hpp
>> class B{
>> static int y;
>> };
>> Source a.cpp
>> int A::x = 0;
>> Source b.cpp
>> int B::y = 0;
>
> Btw: das Beispiel wiederspricht sich mit deiner ursprünglichen Frage,
> wie ich gerade gemerkt habe, ints sind keine Objekte (und führen die
> Frage ad absurdum)

Ups, ints sind doch Objekte...
Aber Objekte ohne Konstruktoren führen die Frage so oder so ad absurdum

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.