Ответ 1
Не используйте cout
для целей отладки, но определяйте другой объект (или функцию или макрос), который ему звонит, затем вы можете отключить эту функцию или макрос в одном месте.
Я часто использую cout
для цели отладки во многих разных местах моего кода, а затем я расстраиваюсь и комментирую все их вручную.
Есть ли способ подавить вывод cout во время выполнения?
И что еще более важно, скажем, я хочу подавить все выходы cout
, но я все же хочу видеть 1 конкретный вывод (пусть и конечный вывод программы) в терминале.
Можно ли использовать "другой способ" печати на терминал для отображения вывода программы, а затем при подавлении cout все еще видят вещи, которые печатаются с использованием этого "" другим способом ""?
Не используйте cout
для целей отладки, но определяйте другой объект (или функцию или макрос), который ему звонит, затем вы можете отключить эту функцию или макрос в одном месте.
Конечно, вы можете (пример здесь):
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
заставит его молча отбрасывать любой вывод, пока битбит не будет очищен.
Чтобы подавить вывод, вы можете отключить базовый буфер от 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;
}
Пользователь cerr
- стандартный поток вывода для ошибок в целях отладки.
Также существует clog
- стандартный выходной поток для ведения журнала.
Как правило, оба они ведут себя как a cout
.
Пример:
cerr << 74 << endl;
Подробности: http://www.cplusplus.com/reference/iostream/cerr/
Кажется, вы печатаете отладочные сообщения. Вы можете использовать TRACE в Visual С++/MFC или просто можете создать функцию Debug()
, которая позаботится об этом. Его можно реализовать, только если установлен отдельный флаг. Например, многие программы используют параметр командной строки с именем verbose
или -v
, чтобы управлять поведением своих сообщений журнала и отладки.