Построить DebugOutputString

0

есть ли другая возможность объединить DebugOutputString, кроме этого:

std::ostringstream outs;   
outs.precision(6);
outs << mMainWndCaption << _T("FPS: ") << fps;
DebugOutputString(_T(outs.str().c_str()));

Может быть, что-то более легкое для вывода, например, в printf?

Я ищу что-то вроде DebugOutputString(_T("FPS: %i", fps)); например

Теги:
visual-studio
visual-c++

2 ответа

1

Одна из проблем с подходом ostringstream заключается в том, что вы можете столкнуться с интересными результатами, если вы создаете приложение для юникода. Я думаю, вы не используете unicode здесь, так как:

DebugOutputString(_T(outs.str().c_str()));

не будет компилироваться - он будет предварительно обрабатывать:

DebugOutputString(Louts.str().c_str());

Даже для этого вам необходимо условно использовать либо basic_ostringstream<char> либо basic_ostringstream<wchar_t> на основе ваших настроек проекта. Но я отвлекся.


Посмотрите на вызов API FormatMessage. Есть некоторые предостережения для его использования, например, выделяет ли система память для вас, и если вам нужно удалить буфер и т.д. И у него есть несколько несколько разных параметров форматирования. Но это сделало бы то, что вы хотите.

В вашем случае вы можете написать метод, который будет принимать ваши параметры и передавать их непосредственно в DebugOutputString - фактически, страница API предоставляет пример, который возвращает форматированный буфер... вам просто нужно запомнить LocalFree после использования.

Вот быстрая версия:

void OutputFormattedDebug(LPTSTR pMsg, ...) {
    LPTSTR pBuffer = NULL;
    va_list args = NULL;
    va_start(args, pMsg);
    FormatMessage(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER, pMsg, 0, 0, (LPTSTR)&pBuffer, 0, &args);
    va_end(args);

    if (pBuffer) {
        OutputDebugString(pBuffer);
        LocalFree(pBuffer);
    }
}
...
OutputFormattedDebug(TEXT("Just a test: %1\n"), TEXT("Hello"));

Это выводит Just a test: Hello в окне отладки. Это становится немного причудливым, если вы указываете ширину и все, но посмотрите на документацию, чтобы отсортировать вас.

0

Только вчера я включил его в один из моих собственных проектов.
Может быть, это поможет вам:

void DebugWrite(LPCTSTR format, ...)
{
    CString text;
    va_list args;
    va_start(args, format);
    text.FormatV(format, args);
    va_end(args);

    OutputDebugString((LPCTSTR)text);
}

Вы можете позвонить ему:

DebugWrite(_T("FPS: %i"), fps);
  • 0
    Красиво и просто, но отчасти зависит от использования MFC / ATL.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню