#ifdef -> einrücken oder nicht?


  • Administrator

    gruppa schrieb:

    Ja ne ich mein ob es bei 1 Flag also einem if-zweig überhaupt Sinn macht? Also wenn man jetzt z.B. 2 oder 3 Flags hätte die jeweils ifdef->else->ifdef->else...hätten würde ich sicherlich verstehen - macht das bei 2 auch Sinn? Bitte nicht böse verstehen - ich frage mich ob das nicht mit Kanonen auf Spatzen schießen ist bei einem Programm das z.B. nur 5k-10k Zeilen hat oder so...

    Ich frag dich nochmals, wie willst du es sonst machen? Wie ich schon sagte, ich habe oft nur ein einziges "Flag", daran ist überhaupt nichts abnormal.
    Ob es für dein Programm sinn macht, dass kann ich nicht beurteilen, da ich das Programm nicht kenne. Aber eben, wie sehen denn die Alternativen aus, welche du hast?

    Grüssli



  • ja die alternativen sehen eben nur so aus dass man an jede stell wo flag-abhängig compiliert werden soll eben ein #ifdef->#else->#endif steht.

    Aber ok - ich habe jetzt den Hintergrund glaube ich verstanden...



  • ...gibt es hier im forum jemanden der das noch so macht? ich wüsste nur gern ob das üblich ist...



  • Wenn du meint, ob jemand #ifdef einrückt. Nein, ich mache es nicht. Bei include guards macht es gar keinen Sinn (sind sowieso nur ganz oben und ganz unten). Wenn abhängig von (PräPro-)Konstanten unterschiedlicher Code compiliert werden soll (also z.B. mitten in einer Funktion), dann macht es auch keinen Sinn - hier sollte (nur!) die normale Einrückung des zu kompilierenden Codes im Vordergrund stehen. Und bei kleineren Statements in Headern könne man es machen, ich halte es aber für unnötig, da diese bei mir eigentlich nie Dimensionen annehmen, die eine Einrückung nötig machen. Trotzdem finde ich aber Draveres Variante recht elegant (Raute am Anfang, eigentliche Anweisung eingerückt).



  • eh nein ihc meine nicht das einrücken sondern die variante alle #ifdefs in separater datei zu kapseln und dann nur einmal einzubinden...



  • ich z.b. schreibe im Moment an etwas was sowohl seriell laufen soll als auch parallel.

    Mache es einfach nur parallel oder nur sequentiell. Parallele Programme haben normalerweise eine ganz andere Architektur als sequentielle.



  • Nein das will ich nicht. Mir wurde eingetrichtert nach SingleSource Prinzip zu arbeiten und ich will das auch. Es wird ja wohl einen eleganten und effizienten und allgmein üblichen weg geben beides in einem code zu vereinen...



  • gruppa schrieb:

    Nein das will ich nicht. Mir wurde eingetrichtert nach SingleSource Prinzip zu arbeiten und ich will das auch. Es wird ja wohl einen eleganten und effizienten und allgmein üblichen weg geben beides in einem code zu vereinen...

    was knivil meint ist, dass sequentielle archtiekturen komplett anders aussehen als parallele. wenn du es richtig machen würdest, hättest du 2 komplett unterschiedliche designs. denn parallel löst du einfach probleme komplett anders...

    und beides mit dem selben design zu realisieren kann nicht optimal sein...



  • ok ....ich verstehe jetzt knivil aber bin überrascht...ich wüsste jetzt überhaupt nicht wo der unterschied sein sollte bzw. wieso man da unterschiede hat.
    Und wenn es unterschiede gibt, warum wird von Leuten die sich deutlich im Forschungsbereich etabliert haben verzählt, dass man sequentiell und parallel in einen code packen sollte...



  • Ich finde es sehr interessant, was hier geschrieben wird 🙂 Ich habe zu dem Thema auch eine Frage: Was ist zum Beispiel, wenn ich in C++ eine Socketklasse schreiben will, die Plattformunabhängig ist? Es handelt sich hierbei nur um ein Beispiel. Ich weiß, dass es sowas bereits gibt 🙂

    Sehe ich das richtig, dass ich die Klasse für jedes System neu schreiben soll?

    #ifdef WIN32
    #include "win32/Socket.h"
    //...
    #else
    #error Not supported yet.
    #endif
    

    Ich hätte ja sehr viel doppelten Code. Was mache ich dann zum Beispiel, wenn ein Bug gefunden wurde?
    Ich müsste in jeder Datei etwas abändern. Ist das nicht sehr fehleranfällig?

    In der Hinsicht habe ich meine Zweifel...

    MisterDoubt



  • *push



  • würde denn bezüglich der augangsfrage mit der bedingten kompilierung vielleicht funktions-pointer ein sinnvolle alternative ?



  • gruppa schrieb:

    ok ....ich verstehe jetzt knivil aber bin überrascht...ich wüsste jetzt überhaupt nicht wo der unterschied sein sollte bzw. wieso man da unterschiede hat.
    Und wenn es unterschiede gibt, warum wird von Leuten die sich deutlich im Forschungsbereich etabliert haben verzählt, dass man sequentiell und parallel in einen code packen sollte...

    Ne, das hast du falsch verstanden.

    Du kannst parallelen und sequentiellen Code schon gemeinsam haben (musst du sogar). Aber du löst Probleme unterschiedlich. Du kannst ein Problem zB parallel lösen oder aber sequentiell. Die Lösung wird bei beiden varianten funktionieren, aber komplett anders aussehen.

    Sehen wir uns zB IO an. Wir haben eine blockende Operation. Jetzt können wir diese zB über etwas select() ähnliches ansteuern um zu wissen wann wir welche Aktion setzen können, oder aber über signale die asynchron laufen.

    Beides funktioniert, aber der ganze ansatz ist ein komplett anderer.

    deshalb denke ich, dass es nicht sehr sinnvoll sein kann beides gleichzeitig anzubieten.



  • Ok danke - und nochmal zu meinem jetzigen vorhaben bezüglich der auslagerung der ifdefs.

    Ich habe jetzt vor für den sequentiellen code ein file anzulegen im ordner sequentiell/variante1.hpp und für den parallelen code ein file anzulegen im ordner parallel/variante2.hpp bzw. einfach nur die 2 files im source-verzeichnis.

    Und in jedes file abhängig von sequentiell/parallel die funktion mit gleichem namen von der syntax her zu benennen und über 1 ifdef dann in den jeweiligen *.cpp files einzubinden.

    Damit wird über den präprozessor immer nur ein file von den beiden eingebunden und die sequentielle oder parallele funktion angestoßen.

    Wäre das ein sauberer weg? War doch das was ihr (Dravere etc...) mir vorgeschlagen haben...oder?



  • Und dann fällt mir noch was ein bzw. eine Frage:

    Wenn ich jetzt z.B. in einem flag einiges ausführen möchte im anderen aber nichts... macht dann sowas sinn?

    //irgendwo in main.cpp z.B.
    
    finalize();
    
    //in file variante1.hpp
    
    void finalize()
    {
        delete ....//irgendwas
        lib_call_finalize();
    }
    
    //in file variante2.hpp
    
    void finalize()
    {
    
    }
    


  • ja und ja.



  • Danke erneut für die Antwort. Könnte man das auch irgendwie über Makros realisieren. Also ein Makro setzen in der main z.B. und dann die verzweigung in separatem file oder so ähnlich? Ginge das und wenn ja - wie?



  • gruppa schrieb:

    Danke erneut für die Antwort. Könnte man das auch irgendwie über Makros realisieren. Also ein Makro setzen in der main z.B. und dann die verzweigung in separatem file oder so ähnlich? Ginge das und wenn ja - wie?

    Dafür hast du ja die proxy dateien.
    foo.cpp sieht zB so aus:

    #ifdef X
    #  include "X/foo.cpp"
    #elif Y
    #  include "Y/foo.cpp"
    ...
    


  • bitte nicht wundern warum ich so nachbohre...es interessiert mich einfach:

    zu schadeofmine: hmm...meinst Du jetzt dass das so gesehen das gleiche ist? Über Makros und über die auslagerung der ifdefs?

    Ich würde gerne noch folgendes wissen und hoffe auf die Geduld der Leser 🙂

    * Wenn ich jetzt über eine bedingte Kompilierung eine leere Methode einbinde (wie z.B. das finalize() vom vorigen post) - ist das von der Performance her bremsed. Natürlich nur unwesentlich aber wenn es z.B. sehr oft vorkommen würde...? Nur aus Interesse die Frage...

    * Würde man vielleicht sowas auch über function-pointer lösen - also über ein if-else einen function-pointer zur laufzeit definieren und dann über diesen in die richtige methode switchen? Oder wäre das von der performance her langsamer oder gar unübersichtlicher?



  • gruppa schrieb:

    * Wenn ich jetzt über eine bedingte Kompilierung eine leere Methode einbinde (wie z.B. das finalize() vom vorigen post) - ist das von der Performance her bremsed. Natürlich nur unwesentlich aber wenn es z.B. sehr oft vorkommen würde...? Nur aus Interesse die Frage...

    ja, bremst, wenn finalize() nicht inline ist und in einer anderen cpp-datei wohnt und der compiler sie nicht einfach wegoptimieren kann.
    wenn sie in einem header wohnt und inline ist, kostet das gar nix.


Anmelden zum Antworten