Mit präprozessor befehlen Auskommentieren



  • Die Verarbeitungsreihenfolge ist im Standard festgelegt - und Kommentare werden vor der Behandlung von Präprozessor-Makros verarbeitet. Eventuell hilft dieser Beitrag weiter.


  • Mod

    Lass eben noch einen externen Makroprozessor zuvor auf das Programm los. Ach, wozu ein Makroporzessor? Selbst ein einfaches sed sollte schon ausreichen.



  • http://drdobbs.com/184401344

    Edit: Ich sollte meine eigenen Google-Links zuerst vollständig lesen und dann erst posten.



  • Die idee war sehr gut aber es ging leider auch nicht.

    Hat noch keine eine Idee?

    Bitte ich habe nicht mehr viel Zeit.



  • Bitte ich habe nicht mehr viel Zeit.

    Haha, der war gut... 🕶


  • Mod

    nichtconnected schrieb:

    Die idee war sehr gut aber es ging leider auch nicht.

    Welche?

    Hat noch keine eine Idee?

    Was spricht gegen ein sed s#Extra#//# oder vergleichbares vor dem Compilieren? Das kannst du auch wunderbar hintereinanderschalten mit ein bisschen Pipemagie, z.B.:

    < input.cc sed s#Extra#//# | g++ -xc++ -c -o input.o -
    

    Dann braucht es nur noch einer kleinen Änderung deines Compileraufrufs zu gerade dem obigen und alles ist gut. Falls du schon ein Makefile oder ähnliches hast, sollte das schon fast trivial zu ändern sein.



  • SeppJ schrieb:

    nichtconnected schrieb:

    Die idee war sehr gut aber es ging leider auch nicht.

    Welche?

    Michael E. sein Link

    Muss man sed nicht extra installieren?


  • Mod

    nichtconnected schrieb:

    Muss man sed nicht extra installieren?

    Es ist kein Teil eines C++-Compilers. Wenn es absolut unabhängig portierbar sein muss, kannst du ja selber ein kleines Ersetzenprogramm mitliefern (oder eine Opensource-Implementierung von sed), welches als allererstes übersetzt wird und dann im folgenden vor alle weiteren Compilierungsvorgänge geschaltet wird.



  • Was ist mit #ifdef und #ifndef?

    SeppJ schrieb:

    eine Opensource-Implementierung von sed

    😃 Was sonst?



  • Das ist nicht genau das selbe, aber womöglich tut's schon

    #define Extra if(false)
    


  • @seldon
    Es reicht nicht für mich. Ich will die ganze Zeilen, die mit Extra anfangen auskommentieren.

    @SeppJ
    Danke, aber ich muss es leider mit präpozessor befehlen machen.

    Ich bin langsam überzeug, dass es nicht möglich ist.



  • Wenn es sich bei der Anwendung nur um eine Art DEBUG_ONLY handelt, kann man auch ein normales Makro nehmen:

    #ifdef DEBUG
        #define DEBUG_ONLY(...) __VA_ARGS__
    #else
        #define DEBUG_ONLY(...)
    #endif
    

    Dann ist eben

    DEBUG_ONLY cout << "Pos:" << get_pos(x, y);
    -->
    DEBUG_ONLY(cout << "Pos:" << get_pos(x, y));
    

    Das finde ich noch annehmbar, in Anbetracht der Tatsache, dass es keine wirkliche Alternative gibt.



  • @ipsec

    Ich habe nicht verstanden. Kannst du erkäeren was genau dieser Code macht?



  • nichtconnected schrieb:

    @ipsec

    Ich habe nicht verstanden. Kannst du erkäeren was genau dieser Code macht?

    Das angegebene Statement wird nur im Debug-Build ausgeführt.



  • seldon schrieb:

    Das ist nicht genau das selbe, aber womöglich tut's schon

    #define Extra if(false)
    

    Das kann nicht funktionieren, da dann "offizielle Befehle" folgen müssen - Kommentare sind da völlig unmöglich.



  • Hacker schrieb:

    Das kann nicht funktionieren, da dann "offizielle Befehle" folgen müssen - Kommentare sind da völlig unmöglich.

    Wenn man Kommentare hat, schreibt man auch nicht Extra , sondern // an den Zeilenanfang. Es geht hier schon um bedingte Kompilierung. Aber dafür ist if(false) auch nicht ganz das Wahre, weil der Code trotzdem kompiliert wird.



  • Sorry wenn ich doof frage, aber welchen Sinn soll das haben? Und warum nicht:

    #define EXTRA
    
    #ifdef EXTRA
     foobar();
    #endif
    

    ??
    Bei Bedarf kannst das #define EXTRA ja auskommentieren.



  • Ich hätte das auch einmal gerne gehabt: Bei der GUI-Programmierung hatte ich mir ein Edit-Feld in einem Debug-Fenster angelegt, das bei jedem Aufruf von

    dbgout << "Fehler (" << err << ")\n";
    

    , falls nicht sichtbar, angezeigt und der Text dem Editfeld zugefügt wird (ein Editfeld deswegen, weil ich darin im Ggs. zu einer Konsole "beliebig" viel Text unterbringen kann).
    Natürlich möchte man das nur in der Debug-Version haben. Und jedes mal nen #ifdef/endif da herum zu haben, ist auch nicht so toll.

    Ich habe mir dann damit geholfen, in den Release-Versionen die Operatoren einer anderen Klasse aufzurufen, die diese Eingaben sofort verwirft.
    In den Release-Versionen wird somit auch kein zusätzlicher Code ausgeführt - es wäre aber dennoch einfacher gewesen, den Präprozessor zum Auskommentieren zu überreden.



  • yahendrik schrieb:

    Ich hätte das auch einmal gerne gehabt: Bei der GUI-Programmierung hatte ich mir ein Edit-Feld in einem Debug-Fenster angelegt, das bei jedem Aufruf von

    dbgout << "Fehler (" << err << ")\n";
    

    , falls nicht sichtbar, angezeigt und der Text dem Editfeld zugefügt wird (ein Editfeld deswegen, weil ich darin im Ggs. zu einer Konsole "beliebig" viel Text unterbringen kann).
    Natürlich möchte man das nur in der Debug-Version haben. Und jedes mal nen #ifdef/endif da herum zu haben, ist auch nicht so toll.

    Ich habe mir dann damit geholfen, in den Release-Versionen die Operatoren einer anderen Klasse aufzurufen, die diese Eingaben sofort verwirft.
    In den Release-Versionen wird somit auch kein zusätzlicher Code ausgeführt - es wäre aber dennoch einfacher gewesen, den Präprozessor zum Auskommentieren zu überreden.

    In so einem Fall kann man doch eine globale Funktion machen:

    void dbgout(const std::string& description)
    {
    #ifdef _DEBUG
       std::cerr << "Fehler: " << description << std::endl;
    #endif
    }
    

    Ich behaupte mal, dass im Release Modus der komplette Call auf die Funktion wegoptimiert wird.



  • Scorcher24 schrieb:

    In so einem Fall kann man doch eine globale Funktion machen

    ... und nur einen String übergeben.

    Nein, eine Klasse mit überladenen Streamoperatoren ist dafür ideal.


Anmelden zum Antworten