Frage zu bestimmter Definition
-
Hallo Allerseits!
// Blah.h void Blubb() { static int Array[4] = {0}; ... }Wird der Speicher für das Array in jedem Modul reserviert, was Blah.h?
Das war's schon! Vielen Dank für Eure Tips!
-
Sollte heißen:
Wird der Speicher für das Array in jedem Modul reserviert, in welches Blah.h eingefügt wird?
-
nein. nur einmal. und zwar beim erstmaligen aufruf der funktion.
Meep Meep
-
OttoDerDritte schrieb:
Hallo Allerseits!
// Blah.h void Blubb() { static int Array[4] = {0}; ... }Wird der Speicher für das Array in jedem Modul reserviert, was Blah.h?
Das war's schon! Vielen Dank für Eure Tips!
...was Blah.h einbindet, nehme ich an.
Ja. Eben so wird die Funktion in jedem Modul definiert, woraufhin sich der Linker beschweren wird, dass mehrere Funktionen mit gleichen Namen existieren, wenn die Module zusammengefügt werden.
Code hat in Header-Dateien nur etwas zu suchen, wenn er inline oder als template-Funktion deklariert wird.
-
Wenn du die Funktion Blah inline machst ist es OK sie in einem Headerfile zu haben (sonst eher nicht, ausser das Headerfile wird genau 1x im Projekt verwendet, dann braucht es aber eigentlich kein Headerfile mehr zu sein).
Die statischen Variablen da drinnen dürfen laut C++ Standard trotzdem nicht "dupliziert" werden. Bloss halten sich leider nicht alle Compiler so 100% daran.
Mit MSVC 7.1 gibt es in einigen Situationen z.B. Probleme, speziell mit Klassentypen.
-
Dafür gibts in VC doch __declspec(selectany), wobei dann nur eine definition aus den modulen als endgültiger wert herausgesucht wird oder?
-
Nope.
Das Problem beim VC7.1 ist nicht dass er die Variable doppelt anlegen würde, sondern dass er das Flag welches abgibt ob sie schon konstruiert wurde doppelt anlegt.
Passiert auch nicht in allen Situationen, anscheinend nur bei static inline Memberfunktionen mit lokalen static Variablen - bei normalen inline Memberfunktionen mit static Variablen funktioniert es wie es sollte.Der Effekt ist dann dass die Variable z.B. doppelt konstruiert wird (was man oft nicht merkt), aber auch doppelt zerstört wird (was oft sehr schlecht ist).
Da dieses Flag in C++ "keinen Namen hat" (weil es ein Implementierungs-Detail ist) kann man auch kein __declspec(selectany) davorpacken.Davon abgesehen, selbst WENN man mit __declspec(selectany) den Problem beheben könnte wäre das Verhalten von VC7.1 immernoch falsch, da der Standard eben verlangt dass es ohne irgendwelche tricks "ganz automatisch" richtig gemacht wird.