Der Martin: dynmische variablen in c++

Beitrag lesen

Hallo Christian,

Nein, denn in C/C++ existieren zur Laufzeit keine Variablennamen mehr. Der Code wird ja vom Compiler in reine Maschinensprache übersetzt, die Variablenbezüge werden damit auf Speicheradressen umgesetzt. Der Name der Variablen geht bei der Übersetzung komplett verloren und ist für die Ausführung des Programms auch nicht mehr erforderlich.

Das ist nicht wahr. Übersetzt man eine Datei als „shared object“ (DLL unter Windows), muss und wird für globale Variablen in der Symbol-Tabelle ein Eintrag angelegt werden, damit eventuelle Zugriffe von Programmen auf diese Variable aufgelöst werden können.

Ja, richtig.
Aber dann sprechen wir nicht mehr über programminterne Bezeichner, denn z.B. bei einer Windows-DLL ist der Name, unter dem eine Variable oder Funktion exportiert wird, nicht zwangläufig identisch mit dem Namen, den dasselbe Objekt auf Quelltextebene hatte. Ich kann den Linker anweisen, eine bestimmte Funktion in der Liste der exportierten Funktion ganz anders zu benamsen (macht man normalerweise nicht, weil's bequemer ist, die Funktionen von Anfang an "richtig" zu benennen). Ich kann den Linker auch anweisen, nur ausgewählte Funktionen/Variablen überhaupt zu exportieren.

Wir haben also hier eine betriebssystemspezifische Schnittstelle zwischen verschiedenen Programmmodulen, die nicht auf jedem System überhaupt existieren muss und die auf einem gegebenen System (Linux, Windows) auch nicht von der verwendeten Programmiersprache C/C++ abhängig ist. Eine in Assembler/Delphi/VB geschriebene DLL hätte die gleiche Schnittstelle.

Deswegen gilt dein Einwand nur für bestimmte Plattformen und selbst dann nur unter bestimmten Voraussetzungen..

Unter Linux könnte man dann mit dem dynamischen Linker per dlsym() auf diese Variablen zugreifen. Ich nutze diese Technik für Plugins und Templates im CForum.

Ja, unter Windows gibt es vergleichbare Möglichkeiten. Doch ich kann damit strenggenommen nicht auf die Bezeichner zugreifen, die im Quelltext verwendet wurden, sondern nur auf diejenigen, die der Linker bei der Erstellung der DLL zur Verfügung stellt, und das ist, wie gesagt, nicht unbedingt dasselbe.

Schönen Abend noch,

Martin

--
Was sagt die kleine Kerze zur großen Kerze?
Ich gehe heute nacht aus!