Eigene standardbibliothek implementieren ?



  • Hoi,
    arbeite mit gcc unter linux.

    Gibt es eine möglichgeit, einem programm via #include <iostream> eine andere standardbibliothek anzugeben? Okay das ist recht einfach, aber:

    Wenn ich meine programme als shared library compiliere, die standardbibliothek da aber nicht mit reincompiliere, sondern von meinem loader zur verfügung gestellt wird,... hä?

    Ich werde natürlich nicht die gesamte standardbibliothek reimplementieren. Bitte sagt mir auch, man könne das anders einfacher machen. Ist ja schließlich mein projekt.

    EDIT: Zwei programteile: Eine shared-library, eine ausführbare datei. Die ausführbare datei ("loader") hat die standadbibliotheksimplementierung, die shared-library benutzt diese, soll aber immer die des loaders benutzen. Die implementiereung kann abweichen, die benutzung aber nicht...



  • lk schrieb:

    ... hä?

    Das war auch mein erster Gedanke. Kannst du noch mal beschreiben, was du eigentlich vor hast?

    Edit:

    lk schrieb:

    EDIT: Zwei programteile: Eine shared-library, eine ausführbare datei. Die ausführbare datei ("loader") hat die standadbibliotheksimplementierung, die shared-library benutzt diese, soll aber immer die des loaders benutzen. Die implementiereung kann abweichen, die benutzung aber nicht...

    Hm.. ich weiß die Frage nervt dich bestimmt, aber wozu? Wenn ich das richtig verstehe, hast du vor sowohl einen Linker, als auch große Teile der C++ Standardbibliothek zu implementieren? Na dann viel Spaß. 😮



  • Schau, was passiert, wenn Du eine pure virtual function callst oder eine Exception nicht fängst. Da kommen Ausgaben. Die könnten über cout oder cerr passieren und im Startup-Code inline sein. Wer weiß? Mußt dazu den Code anschauen, wo das passiert.
    Vermutlich würde es klappen, wenn Du <iostream> komplett identisch reimplemtiert. Aber dann ist schon die Frage, wozu?
    Tust Du aber ein besseres moderneres cout basteln, denke ich, es kalppt nur, wenn Du auch den Startup-Code entsprechend anpaßt.



  • Okay okay.
    Fürs erste wäre ein myprintf(char*,...) ausreichend. Aber die frage bleibt offen, wie kirege ich eine referenz auf diese funktion, die doch in dem loader ist, in der shared lib? (also benutzung)

    loader.cp

    #include "api.h"
    int main()
    {
        // load shared lib...
        FUNC* shared_libs_main = /*aus shared lib*/;
        shared_libs_main("Hello module");
        reutnr 0;
    }
    

    sharedlib.cp

    #include "api.h"
    void shared_libs_main(char* welcomeer)
    { log("[!] You welcomed me with \"%s\"",welcomeer); quit("normal quit.",0); }
    

    api.h - steht zu jedem zeitpunkt bereit (shared libs können sie benutzen sowie der loader.)

    int log(char* format, ...);
    int quit(char* message, int code);
    // etc...
    

    api.cpp - nur der loader hat die implementation.

    #include "api.h"
    int log(char* format, ...) { /*wrapper für printf oder so was.*/ }
    int quit(char* message, int code) { log("[quit] A module selfdestructed itself with \"%s\" and the code %s",message,code); }
    

    Da sollte also bei ausführung des loaders das rauskommen:
    `[!] You welcomed me with "Hello module"

    [quit] A Module selfdestructed itself with "normal quit." and code 0`



  • Worum geht es dir eigentlich? Willst du diese Log-Funktion umsetzen (da wäre vprintf() eventuell ein geeignetes Hilfsmittel) oder willst du es automatisch in dein Programm integrieren?



  • Mein Tipp:
    Du hast noch nie eine externe Bibliothek genutzt und denkst, die wären das Gleiche wie die unter Windows bekannten DLL's. [Falls das wahr ist: http://msdn.microsoft.com/en-us/library/ms235627.aspx ]



  • printf gehört zur C-Standardlib und ist das letzte, das ich freiwillig implementiere. Warum gibts mit C++0x nicht eigentlich eine typsichere Version davon?



  • Ich habe nie DLLs programmiert, nur unix shared objects. fand ich auch recht bockig, aber mir gehts darum,... wie kann die geladene shared-library überhaupt auf irgendwelche funktionen im loader zugreifen o.O ?!



  • 314159265358979 schrieb:

    Warum gibts mit C++0x nicht eigentlich eine typsichere Version davon?

    Abwärtskompatibilität.



  • Ich meinte eher zusätzlich zur C-Version.



  • 314159265358979 schrieb:

    Warum gibts mit C++0x nicht eigentlich eine typsichere Version davon?

    In C++ sind Streams das übliche Mittel für Ein- und Ausgabe - die kommen sogar ohne variable Argumentlisten aus. Ansonsten kannst du dich sicher mal nach Boost::Format umsehen.



  • CStoll schrieb:

    314159265358979 schrieb:

    Warum gibts mit C++0x nicht eigentlich eine typsichere Version davon?

    In C++ sind Streams das übliche Mittel für Ein- und Ausgabe - die kommen sogar ohne variable Argumentlisten aus. Ansonsten kannst du dich sicher mal nach Boost::Format umsehen.

    Ich persönlich finde printf() deutlich schicker als das ganze operator>> Gedöhns und der Code wird deutlich schlanker & besser lesbar.
    Typsicher ist übrigens zb mit GCC schon die C-Variante von printf, GCC spuckt klare Warnungen aus wenn der Werttyp vom angegebenen abweicht.



  • Ethon schrieb:

    Typsicher [...] klare Warnungen

    Passt meiner Meinung nach nicht zusammen...



  • Ich find's schlechter lesbar. Links steht ein %bla und %blub und rechts kommen erst die Eintragungen. Bei den Streams ist die Reihenfolge hingegen richtig, das ist deutlich besser. Aber die Diskussion ist müßig und sinnlos.



  • EOutOfResources schrieb:

    Ethon schrieb:

    Typsicher [...] klare Warnungen

    Passt meiner Meinung nach nicht zusammen...

    Wenn dasteht: "Hey, du sagst int, ich seh da aber nen const char*" ist das in meinen Augen nicht wirklich unsicherer als ein direkter Compilerfehler.

    Ich find's schlechter lesbar. Links steht ein %bla und %blub und rechts kommen erst die Eintragungen. Bei den Streams ist die Reihenfolge hingegen richtig, das ist deutlich besser. Aber die Diskussion ist müßig und sinnlos.

    Hängt imo vom Einsatzzweck ab.

    "Name: (Hans Peter) Age: 20"

    würde man per Formatstring mit nem einfachen "Name: (%s) Age: %d" String parsen können, mit Streams wäre das etwas unübersichtliches und hässliches geworden.
    Meistens lohnt es sich da direkt Boost.Spirit auszupacken.

    Natürlich gibts andere Fälle, in denen Streams schneller & besser sind, man muss halt je nach Situation entscheiden. (Finde ich zumindestens)


Log in to reply