Noch eine Frage zu c
bearbeitet von Rolf BHallo pl,
PHP und JavaScript sind Scriptsprachen, die sich auf gewaltige Dictionaries stützen. Das kostet Zeit, bringt aber die Flexibilität dieser Sprachen.
C ist ein Makroassembler mit großer Laufzeitbibliothek und einigem Geschick beim Hantieren mit Expressions, die zu einzeiligen Programmen beliebiger Komplexität führen können.
D.h. wenn Du Funktionen namentlich aufrufen können willst, dann
- müssen diese Funktionen eine identische Signatur und Calling Convention haben. WIRKLICH identisch. Sonst Bluescreen.
- musst Du das Dictionary, das Namen auf Funktionen abbildet, selbst implementieren.
Ich weiß gerade nicht ob C sowas im Bauch hat; C++ hat in der STL sicherlich Klassen für ein string->func* Dictionary.
func* ist ein Zeiger auf eine Funktion. Mein C ist arg eingerostet und die Notation ist hinreichend verquast, such Dir Beispiele. Du kannst dann im Dictionary Einträge machen aus Name und Zeiger auf Funktion, und dann an Hand dieses function pointers die Funktionen aufrufen. Ich bezweifle dass es stimmt, aber ich definiere mal für mein Beispiel, dass int(*)(int,int,int) einen Pointer auf eine Funktion darstellt, die 3 int bekommt und eins zurück gibt. Ganz weit weg von der Wahrheit bin ich vermutlich nicht. Damit hantierst Du dann so:
~~~c
int(*)(int,int,int) func = getRegisteredHandlerFor(name);
int result = *func(47,11,42);
~~~
Wenn es typsicher bleiben soll, dann ist diese Suchfunktion nur für Funktionen einer Signatur geeignet. Idiomatisch für idiotisches C wäre aber, diese function pointer als void* zu speichern und bei Bedarf auf einen function pointer mit der (vermeintlich) richtigen Signatur zu casten. TU'S NICHT!
C und C++ sind leider sehr viel sensibler, was Typen angeht, als JavaScript, PHP oder Perl.
Eine C-Library in C++ verwendest Du übrigens prinzipiell so:
~~~c++
extern "C" {
#include <lib.h>
}
~~~
_Rolf_
--
sumpsi - posui - clusi