Wie kann man spät binding in C Sprache erreichen?Wie kann eine späte Bindung in C-Sprache erreicht werden?
Antwort
Späte Bindung ist nicht wirklich eine Funktion der C-Sprache selbst, mehr etwas, das Ihre Ausführungsumgebung für Sie bereitstellt.
Viele Systeme bieten eine verzögerte Bindung als eine Funktion des Linkers/Loaders und Sie können auch explizite Aufrufe wie dlopen
(um eine gemeinsam genutzte Bibliothek zu öffnen) und dlsym
(um die Adresse eines Symbols innerhalb dieser Bibliothek zu erhalten) kann darauf zugreifen oder es anrufen).
Die einzige semi-portable Möglichkeit, eine späte Bindung mit dem C-Standard zu bekommen, wäre, einige Tricks mit system()
zu verwenden, und sogar das ist zumindest teilweise implementierungsspezifisch.
Wenn Sie nicht so sehr über verzögerte Bindung, sondern über Polymorphie sprechen, können Sie diesen Effekt mit Funktionszeigern erreichen. Grundsätzlich erstellen Sie eine struct
, die alle Daten für einen Typ zusammen mit Funktionszeigern zum Suchen der Methoden für diesen Typ enthält. Dann setzen Sie im "Konstruktor" (typischerweise eine init() Funktion) die Funktionszeiger auf die relevanten Funktionen für diesen Typ.
Sie müssen immer noch den gesamten Code enthalten, auch wenn Sie es nicht verwenden, aber ist möglich, Polymorphismus auf diese Weise zu erhalten.
Die Bindung von Symbolen in C wird immer zur Kompilierzeit durchgeführt, niemals zur Laufzeit.
Bibliothek zu binden, oder dynamische Verknüpfung, wie es genannt wird, wird über dlopen()
und dlsym()
auf * nichts, und LoadLibrary()
und GetProcAddress()
auf Windows getan.
Verwenden Sie Objective-C oder Lua. Beide sind spät gebundene Sprachen, die leicht mit C. verbunden werden können.
Natürlich könnten Sie Ihr eigenes Namensauflösungsschema implementieren, aber warum erfinden Sie das Rad neu?
Leider haben Sie kein Betriebssystem angegeben. Für Unix können Sie gemeinsam genutzte Bibliotheken verwenden oder eine konfigurierbare (Plugin-) Modulstruktur erstellen. Für Details ist der Quellcode eines Apache 1.3-Webservers hilfreich. http://httpd.apache.org/download.cgi
cppdev scheint der einzige zu sein, der mit seiner Bemerkung auf den Punkt trifft. Bitte schauen Sie sich the definition itself an. In wenigen Worten:
Späte Bindung oder dynamische Bindung, ist ein Computer-Programmiermechanismus in dem das Verfahren aufgerufen wird, auf ein Objekt mit Namen zur Laufzeit nachgeschlagen.
Alle anderen Antworten verfehlen nur den Hauptpunkt, das heißt "nach Namen suchen".
Die benötigte Lösung wäre sehr ähnlich zu einer Nachschlagetabelle von Zeigern zu Funktionen zusammen mit einer oder zwei Funktionen, um die richtige nach Namen (oder sogar nach Signatur) auszuwählen. Wir nennen es eine "Hash-Tabelle".
Wie wäre es mit einem Array von Funktionszeigern. Wir können dann den Funktionszeiger basierend auf einer Benutzereingabe aus dem Array auswählen – cppdev