2015-09-12 4 views
0

Я иногда использую класс 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, но они не работают.

+0

Определение макроса '_T' является особенно плохим, потому что оно уже существует в tchar.h. В любом случае '_T' является [зарезервированным идентификатором] (http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identifier). – chris

+0

Поскольку вы используете 'OutputDebugString', вам, вероятно, придется загрузить или создать свой собственный инструмент для отладки, который распознает все коды выхода терминала, которые вы хотите поддержать. На самом деле это не так сложно. –

ответ

0

Собственно, ответ проще, чем я думал. Просто щелкните правой кнопкой мыши в окне вывода и выберите «Вывод программы». Он просто показывает вам выход программы без всех других бит. Нет необходимости в цветах.

Кроме того, он доступен от VS2005 до текущей версии, без необходимости устанавливать различные расширения Visual Studio для разных версий VS.

1

Если я правильно Вас понял, что вы можете сделать такие вещи, с помощью расширений: VSColorOutput или VSCommands for Visual Studio

Они могут изменить внешний вид в окне вывода. Вы можете использовать поведение вне поля или добавлять специальные символы при выводе с классом DOut и создавать собственное правило, как его покрасить.

VSColorOutput подключается к цепочке классификаторов Visual Studio. Это позволяет VSColorOutput контролировать каждую строку, отправленную в окно вывода. Проверяется список классификаторов, состоящий из регулярных выражений и классификаций. Первое совпадающее выражение определяет классификацию строки текста. Если шаблоны не совпадают, строка классифицируется как общий текст сборки.

+0

Что делают эти инструменты? Какую часть сообщения, по вашему мнению, они обращают? Почему эта информация, отсутствующая в вашей ссылке, отвечает только? –

+0

Они могут изменять внешний вид в окне вывода. Вы можете использовать поведение вне поля или добавлять специальные символы при выводе с классом DOut и создавать собственное правило, как его покрасить. –

+0

Эти расширения должны быть загружены для использования. Поэтому я добавил ссылки, чтобы сэкономить ваше время на googling =) Спасибо за отзыв - я немного обновил свой ответ. –

Смежные вопросы