Как отключить вывод cout во время выполнения?

Я часто использую cout для цели отладки во многих разных местах моего кода, а затем я расстраиваюсь и комментирую все их вручную.

Есть ли способ подавить вывод cout во время выполнения?

И что еще более важно, скажем, я хочу подавить все выходы cout, но я все же хочу видеть 1 конкретный вывод (пусть и конечный вывод программы) в терминале.

Можно ли использовать "другой способ" печати на терминал для отображения вывода программы, а затем при подавлении cout все еще видят вещи, которые печатаются с использованием этого "" другим способом ""?

Ответ 1

Не используйте cout для целей отладки, но определяйте другой объект (или функцию или макрос), который ему звонит, затем вы можете отключить эту функцию или макрос в одном месте.

Ответ 2

Конечно, вы можете (пример здесь):

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;
}

Выходы:

First message
Last message

Это связано с тем, что перенос потока в состояние fail заставит его молча отбрасывать любой вывод, пока битбит не будет очищен.

Ответ 3

Чтобы подавить вывод, вы можете отключить базовый буфер от 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;
}

Ответ 4

Пользователь cerr - стандартный поток вывода для ошибок в целях отладки.

Также существует clog - стандартный выходной поток для ведения журнала.

Как правило, оба они ведут себя как a cout.

Пример:

cerr << 74 << endl;

Подробности: http://www.cplusplus.com/reference/iostream/cerr/

http://www.cplusplus.com/reference/iostream/clog/

Ответ 5

Кажется, вы печатаете отладочные сообщения. Вы можете использовать TRACE в Visual С++/MFC или просто можете создать функцию Debug(), которая позаботится об этом. Его можно реализовать, только если установлен отдельный флаг. Например, многие программы используют параметр командной строки с именем verbose или -v, чтобы управлять поведением своих сообщений журнала и отладки.