Я иногда использую класс DOUT (перечислены ниже) для отладкиИзменение цвета отладки вывода
#include<fstream>
#include<iostream>
#include<sstream>
#define WIN32_LEAN_AND_MEAN
#include<Windows.h>
#ifdef UNICODE
#define tostream wostream
#define tostringstream wostringstream
#define _T(x) L##x
#else
#define tostream ostream
#define tostringstream ostringstream
#define _T(x) x
#endif
class DOut : public std::tostringstream
{
public:
//http://stackoverflow.com/questions/2212776/overload-handling-of-stdendl
DOut& operator << (std::tostream&(*f)(std::tostream&))
{
if (f == std::endl)
{
*this << _T("\n");
OutputDebugString(str().c_str());
str(_T(""));
}
else
{
*this << f;
}
return *this;
}
//https://hbfs.wordpress.com/2010/12/21/c-logging/
template <typename TT>
inline DOut & operator << (const TT& t)
{
(*(std::tostringstream*) this) << t;
return *this;
}
};
int main()
{
DOut dout;
int x = 20;
dout << "x = " << x << std::endl;
dout << "x * x = " << x * x << std::endl;
dout << "hexq=" << x*x << "=" << std::hex << x * x << std::endl;
}
Она работает довольно хорошо, за исключением он получает перемежаются со всей выводимой информации в ВС. Например,
'dout.exe': Loaded 'U:\GCS\test\dout\Debug\dout.exe', Symbols loaded.
'dout.exe': Loaded 'C:\WINDOWS\system32\ntdll.dll'
'dout.exe': Loaded 'C:\WINDOWS\system32\kernel32.dll'
'dout.exe': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.VC90.DebugCRT_1fc8b3b9a1e18e3b_9.0.30729.1_x-ww_f863c71f\msvcp90d.dll'
'dout.exe': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.VC90.DebugCRT_1fc8b3b9a1e18e3b_9.0.30729.1_x-ww_f863c71f\msvcr90d.dll'
x = 20
x * x = 400
hexq=400=190
The program '[3108] dout.exe: Native' has exited with code 0 (0x0).
Вышеуказанное не является строго точным, поскольку я не знаю, как заставить stackoverflow отображать монохромный текст. Весь текст только в одном цвете. Я всегда мог вывести его в файл, но это удобно, поскольку у меня не всегда есть консольное окно, и мне не нужно беспокоиться о chdirs, которые меняются там, где записывается выходной файл.
Мне просто интересно, можно ли выводить мою отладочную информацию в другом цвете. Я пробовал escape-последовательности ANSI, но они не работают.
Определение макроса '_T' является особенно плохим, потому что оно уже существует в tchar.h. В любом случае '_T' является [зарезервированным идентификатором] (http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identifier). – chris
Поскольку вы используете 'OutputDebugString', вам, вероятно, придется загрузить или создать свой собственный инструмент для отладки, который распознает все коды выхода терминала, которые вы хотите поддержать. На самом деле это не так сложно. –