Eigene standardbibliothek implementieren ?



  • 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)


Anmelden zum Antworten