static variable in Funktion
-
Wen ich eine statische variable in einer Funktion deklariere:
// deklariert in einer header datei int getValue() { static int type; return type++; }Diese funktion rufe ich jetzt aus zwei Dlls auf, dann habe ich in beiden DLLs
zweimaltypeinitialisiert.
Warum ist das so und wo ist das definiert, dass das so ist?
Bei msdn habe ich nix gefunden.Ist das verhalten bei g++ genauso?
-
Du solltest in der Headerdatei deklarieren und nicht definieren. Du benutzt Header falsch!
Warum ist das so
Weil static sich nur auf die aktuelle Uebersetzungseinheit bezieht, innerhalb von Funktionen eben nur auf die aktuelle Funktion. Wenn du den Header mehrfach inkludierst, dann steht die Funktionsdefinition in mehreren Uebersetzungseinheiten. Deswegen hast du auch mehrere "type". Der Linker kann das manchmal aufloesen, aber da du mehrere DLLs hast, hast du auch mehrere Linkeinheiten.
Du solltest weiterhin die Variable mit einem Wert initialisieren.
-
das ist ein bekanntes Problem bei template und inline Funktionen. bei nicht-inline Funktionen dürfte es eigentlich nicht auftreten
http://www.google.de/webhp?hl=de&tab=ww#bav=on.2,or.r_qf.&hl=de&q=c%2B%2B+template+static+member+dll
-
@dd++
Das ist nicht wirklich inline-spezifisch, sondern hat einfach damit zu tun wie DLLs funktionieren.
Wenn die Funktion in einer statischen LIB definiert ist, die in zwei DLLs verwendet wird, dann gibt es genau so zwei getrennte Variablen.@Nash26
Wenn mit mit "g++" z.B. MinGW meinst, also einen GCC Port der Windows DLLs erzeugen kann, dann ist das Verhalten dort vermutlich gleich. Weil DLLs die "select any" Semantik nicht unterstützen die nötig wäre um es anders zu machen.
-
@hustbaer
ok ist dieses verhalten also nur windows spezifisch.Ich hab schong gesucht aber nicht etwas wirklich passendes dazu auf msdn gefunden,
ausser das hier:
http://msdn.microsoft.com/de-de/library/h90dkhs0(v=vs.90).aspxHier geht es aber eher um eine DLL mit mehreren prozessen.
Hast du noch was handfestes do ich dieses Verhalten nachlesen kann?
-
Nash26 schrieb:
[...] Dlls [...]
Warum ist das so [...]?
Hier geht es aber eher um eine DLL mit mehreren prozessen.C++ kennt keine DLLs. Deine Frage ist System- bzw. Toolchain-spezifisch. Und wie sich verschiedene Prozesse Daten teilen können erst recht. Jeder Prozess bekommt seinen eigenen Speicher, inklusive eigene Variablen mit statischer Lebenszeit. Sinn von DLLs ist es, Code und Read-only-Daten nur einmal im Speicher zu halten. Das schließt aber nicht die änderbaren Datensegmente mit ein. Von denen gibt's für jeden Prozess eine eigene Version.
-
etwas handfestes zum Nachlesen gibts z.B. hier:
http://stackoverflow.com/questions/11962918/local-static-variable-is-instantiated-multiple-times-why
das ist vom Prinzip her ähnlich wie das weiter oben mit den templates
-
Achja, laut dahier:
http://msdn.microsoft.com/en-us/library/w8c3skw3.aspx
sollte__declspec(dllexport)/__declspec(dllimport)in diesem Fall ausreichend sein. Trotzinlineund so.
Wobei das MSVC-Magick ist und eben auch nur mitdllexport/dllimportfunktioniert.
-
Hab hier noch folgenden Link gefunden:
http://msdn.microsoft.com/en-us/library/h90dkhs0%28v=vs.80%29.aspxWin32 DLLs are mapped into the address space of the calling process. By default, each process using a DLL has its own instance of all the DLLs global and static variables.
Die sagen zwar das jeder Prozess eine Kopie lokaler und globaler statischen Daten bekommt, aber nicht was mit DLLs passiert die eine andere DLL benutzen.
Eine DLL ist doch nicht auch so etwas wie ein Prozess?
-
Wie verhält es sich bei DLLs die andere DLLs anlinken?
Gilt da die selbe Aussage wie bei dem Prozess?
-
Nash26 schrieb:
Die sagen zwar das jeder Prozess eine Kopie lokaler und globaler statischen Daten bekommt, aber nicht was mit DLLs passiert die eine andere DLL benutzen.
Was meinst du, gäbe es denn noch für Optionen, was mit anderen DLLs passieren könnte, wenn doch schon klar ist, dass jeder Prozess hat seine eigenen Daten hat?