2015-05-12 24 views
10

Spesso utilizzo cout per scopi di debug in molti punti diversi del mio codice, quindi mi sento frustrato e commento tutti manualmente.Come disabilitare l'output di cout nel runtime?

C'è un modo per sopprimere l'output di cout nel runtime?

E, cosa più importante, supponiamo di voler eliminare tutte le uscite cout, ma voglio comunque vedere 1 output specifico (diciamo l'output finale del programma) nel terminale.

È possibile utilizzare un "" altro modo "" di stampa sul terminale per mostrare l'uscita del programma, e quindi quando si sopprime il cout si vedono ancora cose stampate con questo "" altro modo ""?

risposta

13

non utilizzare cout a scopo di debug, ma definiscono un oggetto diverso (o funzione, o macro) che chiama attraverso di esso, quindi è possibile disabilitare quella funzione o macro in un unico posto.

39

Certo, si può (example here):

int main() { 
    std::cout << "First message" << std::endl; 

    std::cout.setstate(std::ios_base::failbit); 
    std::cout << "Second message" << std::endl; 

    std::cout.clear(); 
    std::cout << "Last message" << std::endl; 

    return 0; 
} 

Uscite:

First message 
Last message 

Questo perché mettere il flusso in fail stato renderà silenziosamente scartare qualsiasi uscita, fino a quando il failbit viene cancellato .

0

Sembra che si stampino messaggi di debug. È possibile utilizzare TRACE in Visual C++/MFC o semplicemente creare una funzione Debug() che si occupa di esso. Puoi implementarlo per attivarlo solo se è impostato un flag distinto. Molti programmi utilizzano un parametro della riga di comando chiamato verbose o -v, ad esempio, per controllare il comportamento dei messaggi di registro e di debug.

9

Per sopprimere l'output, è possibile disconnettere il buffer sottostante da cout.

#include <iostream> 

using namespace std; 

int main(){ 

    // get underlying buffer 
    streambuf* orig_buf = cout.rdbuf(); 

    // set null 
    cout.rdbuf(NULL); 

    cout << "this will not be displayed." << endl; 

    // restore buffer 
    cout.rdbuf(orig_buf); 

    cout << "this will be dispalyed." << endl; 

    return 0; 
}