Rolf B: Noch eine Frage zu c

Beitrag lesen

Hallo 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:

int(*)(int,int,int) func = getRegisteredHandlerFor(name);
int result = (*func)(47,11,42);

Ob die Klammern um *func nötig sind weiß ich nicht - Beherrschung der Operatorenhierarchie von C gehört zu den arkanen Künsten. Und sowohl * (dereference pointer) und () (call function) sind (überladbare) Operatoren. Beide haben hohen Rang, aber aus Sicht eines kleinen plus und minus ist das so weit weg dass man nicht mehr erkennt wer nun höher ist. Lieber Klammern setzen bevor Du versuchst, ein int-Ergebnis als Pointer zu behandeln und zu dereferenzieren. Hier würde immerhin der C-AssemCompiler Einwände erheben, bevor es zum Bluescreen kommt.

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:

extern "C" {
   #include <lib.h>
}

Rolf

--
sumpsi - posui - clusi