std::cout ausgabe ausschalten?



  • Hi zusammen,

    ich habe eine Frage.
    Mein implementiertes Programm enthält noch viele std::cout, welche ich für das Debuggen benötige.
    Da sehr viele Iterationen über meinen Code stattfinden, wird jede Menge durch std::cout ausgegeben.

    Nun meine Frage:
    Da ich nicht alle std::cout auskommentieren möchte, gibt es eine Möglichkeit alle std::cout irgendwie auszuschalten?

    Arbeite mit ecplipse



  • Machs doch über defines..

    #ifdef _DEBUG
    std::cout << "..";
    #endif
    

  • Administrator

    Ja gibt es. Einfach den Puffer von std::cout auf 0 setzen:

    int main()
    {
      std::cout.rdbuf(0); // Ausgeschaltet.
    
      std::cout << "HAAAALLLLOOOOO????" << std::endl; // wird niemand drauf antworten ;)
    
      return 0;
    }
    

    Grüssli



  • naja du kannst das mit makros machen
    wird aber im nachhinein schon en gutes stück arbeit

    so nach dem motto:

    #ifdef _DEBUG        // das war glaub ich der parameter oder?!?
    cout << "Test: " << testvariable << endl;
    #endif
    

    oder du nimmst halt eine andere marko variable
    die du dann am anfang im quelltext #define's 😉
    das _DEBUG hat den vorteil im debugmodus automatisch aktiv zu sein, aber den nachteil dass man es eben nur ausserhalb des debugmodus wegkriegt



  • @Dravere:
    Das ist aber nicht sehr elegant, wenn man keine Spuren mehr haben will.. 😉

    Skym0sh0 schrieb:

    das _DEBUG hat den vorteil im debugmodus automatisch aktiv zu sein, aber den nachteil dass man es eben nur ausserhalb des debugmodus wegkriegt

    Für etwas gibt es ja auch noch #undef..



  • du solltest statt dessen gleich einen logger mit verschiedenen log leveln verwenden.
    erleichtert die arbeit ungemein. neben sehr komplexen logern log4cpp, etc. gibt es abe rauch leichtgewichte, die lediglich einen header benötigen.
    ich benutze eine leicht abgeaenderte version des

    http://www.ddj.com/cpp/201804215

    und im code sieht es dann so aus:

    UBLOG(logINFO,"Berechnungsstart")
    UBLOG(logDEBUG1,"debug blabla")
    

    via policy kann ich die ausgabe auch in logFiles umleiten!

    und du kannst den Ausgabelevel einfach setzten, z.B. mit:

    UbLog::reportingLevel = logINFO; //UBLOG(logDEBUG1,"debug blabla") wird übersprungen.
    

    dadurch erhält man einen deutlich lesbareren code!



  • cool das sind schon einmal 2 gute Möglichkeiten.
    Habe jetzt erst einmal den Vorschlag von Dravere verwendet, indem ich die std::cout einfach ausschalten kann.

    Die andere Lösung erscheint mir aber "sauberer" !?
    Also wie macht ihr so etwas bei euch im Code?
    Das problem ist dann doch aber bei

    #ifdef _DEBUG
    std::cout << "..";
    #endif
    

    das in jeder Methode wo ich diesen Test durchführe eine zusätzliche If Abfrage habe.

    Da es bei meinem Code um Schnelligkeit gehen muss, bin ich da mit

    std::cout.rdbuf(0);
    

    besser versorgt? Oder findet hier diesselbe Überprüfung statt?
    Oder macht das dann schon der Compiler?



  • redbomber schrieb:

    Das problem ist dann doch aber bei

    #ifdef _DEBUG
    std::cout << "..";
    #endif
    

    das in jeder Methode wo ich diesen Test durchführe eine zusätzliche If Abfrage habe.

    das ifdef ist eine preprozessor anweisung -> im binary taucht es gar nicht mehr auf, da der teil vom preprozessor uebersprungen wird!
    beim UbLog uebrigens auch! ich kann dir diesen nur waermstens empfehlen...



  • redbomber schrieb:

    cool das sind schon einmal 2 gute Möglichkeiten.
    Habe jetzt erst einmal den Vorschlag von Dravere verwendet, indem ich die std::cout einfach ausschalten kann.

    Die andere Lösung erscheint mir aber "sauberer" !?
    Also wie macht ihr so etwas bei euch im Code?
    Das problem ist dann doch aber bei

    #ifdef _DEBUG
    std::cout << "..";
    #endif
    

    das in jeder Methode wo ich diesen Test durchführe eine zusätzliche If Abfrage habe.

    Da es bei meinem Code um Schnelligkeit gehen muss, bin ich da mit

    std::cout.rdbuf(0);
    

    besser versorgt? Oder findet hier diesselbe Überprüfung statt?
    Oder macht das dann schon der Compiler?

    Nene..

    #ifdef _DEBUG
    std::cout << "..";
    #endif
    

    Wird bei Release zu:

    
    

    Schneller gehts nicht. 😉
    Ja. Das macht der Compiler für dich..Oder besser gesagt der Präprozessor.


  • Administrator

    #ifdef _DEBUG
    // ...
    #endif
    

    Ist die schnellste Lösung. Das sind Präprozessor Makros. Die werden also vor dem Compiler ausgeführt und der Text wird einfach ersetzt, also wenn _DEBUG nicht definiert ist, durch nichts. Der Code verschwindet. Man kann sich so auch ganz witzige Tools für die Debug Ausgabe basteln:

    #ifdef _DEBUG
    #  define DEBUG_OUTPUT(x) std::cout << x << std::endl
    #else
    #  define DEBUG_OUTPUT(x)
    #endif
    
    int main()
    {
      DEBUG_OUTPUT("Test");
      // Wird im Debug Modus zu:
      // std::cout << "Test" << std::endl;
      // Wird im Release Modus zu:
      // ;
    
      return 0;
    }
    

    Grüssli



  • super, vielen dank habt mir alle geholfen

    nur noch eine Frage:
    bei

    std::cout.rdbuf(0);
    

    ist dies nicht so ? also hier läuft der präprozesser über jedes std::cout drüber?

    und dies betrifft nicht die std::cerr oder? also nehme ich mal an, nachdem wie der befehl heisst.



  • redbomber schrieb:

    super, vielen dank habt mir alle geholfen

    nur noch eine Frage:
    bei

    std::cout.rdbuf(0);
    

    ist dies nicht so ? also hier läuft der präprozesser über jedes std::cout drüber?

    und dies betrifft nicht die std::cerr oder? also nehme ich mal an, nachdem wie der befehl heisst.

    klar, der präprozessor kann nicht erahnen, was letztlich wirklich in cout passiert... die methode via macros ist definitiv die schnellste und beste lösung für dich.

    std::cerr und std::clog sind davon nich tbetroffen. du kannst die ausgabe auch in dateien umleiten... (aber das kostet genauso zeit 😃 )


  • Administrator

    std::cout.rdbuf(0);
    // oder
    std::cerr.rdbuf(0);
    // oder
    std::clog.rdbuf(0);
    // oder
    std::cin.rdbuf(0);
    

    Dies ist normales C++, hat also überhaupt nichts mit dem Präprozessor zu tun. rdbuf(0) macht nichts anderes, als den internen Puffer auf einen Nullzeiger zu setzen und ihn damit auszuschalten.

    Und ja, es betrifft natürlich jeweils nur das Objekt. std::cout , std::cerr und std::clog sind ja normale std::ostream Objekte, während std::cin ein normales std::istream Objekt ist.
    http://www.cplusplus.com/reference/iostream/cout.html
    http://www.cplusplus.com/reference/iostream/cerr.html
    http://www.cplusplus.com/reference/iostream/clog.html

    http://www.cplusplus.com/reference/iostream/cin.html

    Grüssli


Anmelden zum Antworten