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
-
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 arbeitso 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 deshttp://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.
-
#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:
beistd::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:
beistd::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
)
-
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
undstd::clog
sind ja normalestd::ostream
Objekte, währendstd::cin
ein normalesstd::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.htmlhttp://www.cplusplus.com/reference/iostream/cin.html
Grüssli