есть ли другая возможность объединить DebugOutputString, кроме этого:
std::ostringstream outs;
outs.precision(6);
outs << mMainWndCaption << _T("FPS: ") << fps;
DebugOutputString(_T(outs.str().c_str()));
Может быть, что-то более легкое для вывода, например, в printf?
Я ищу что-то вроде DebugOutputString(_T("FPS: %i", fps));
например
Одна из проблем с подходом 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
в окне отладки. Это становится немного причудливым, если вы указываете ширину и все, но посмотрите на документацию, чтобы отсортировать вас.
Только вчера я включил его в один из моих собственных проектов.
Может быть, это поможет вам:
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);