Erzeugen statische Variablen in inline Funktionen undefiniertes Verhalten?
-
Hallo. Ich musste gerade feststellen das der Digital Mars Compiler statische Variablen in inline Funktionen vor main() konstruiert, sogar wenn die Funktion nirgendwo aufgerufen wird.
Beispiel:
inline void createInstance() { static Type object; }
Beim DMC wird das "object" vor Aufruf der Main-Funktion erstellt. Andere Compiler erzeugen das Objekt nur, wenn die Funktion aufgerufen wird.
Erzeugen also statische Variablen in inline Funktionen undefiniertes Verhalten? Wenn ich das inline nämlich wegnehme, funktioniert es auch auf dem DMC wie erwünscht. Oder ist das ein Bug des Compilers?
Mfg Moren
-
Heißt das, sie erzeugen es erst dann, wenn die Funktion aufgerufen wird? Oder erzeugen sie es nur dann (und zwar am Anfang), wenn die Funktion überhaupt im Programm verwendet wird?
Ich find das Verhalten vom DMC eigentlich ziemlich verständlich und hätte es auch so erwartet. static ist nunmal static.
-
Normalerweise werden doch lokale static Variablen erst beim ersten Durchlaufen der Funktion konstruiert.
-
Hallo,
statische Variablen innerhalb von inline-Funktionen sind aus Sicht der Portabilität ein Problem. Das liegt daran, dass inline bis (ca.) 1996 bewirkte, dass eine Funktion "internal linkage" hatte. Demzufolge konnte es mehrere Instanzen der Funktion und damit auch mehrere Instanzen der statische Variable innerhalb der Funktion geben. In Standard C++ haben auch inline-Funktionen standardmäßig "external linkage". Der Compiler muss dafür sorgen, dass, falls out-of-line Definitionen gebraucht werden, es immer nur eine solche Definition gibt und das es demzufolge auch nur eine statische Variable gibt.Zu deiner Frage: inline ändert nicht die Semantik einer Funktion. Für eine statische Variable die innerhalb einer inline-Funktion definiert wird gelten die selben Regeln wie für statische Variablen in "normalen" Funktionen. Sprich: Sie werden beim ersten Aufruf initialisiert.