ostringstream 方法的一个问题是,如果您正在构建一个 unicode 应用程序,您可能会遇到有趣的结果。我猜你在这里没有使用 unicode,因为:
DebugOutputString(_T(outs.str().c_str()));
不会编译 - 它会预处理到:
DebugOutputString(Louts.str().c_str());
即使正确地执行此操作,您也需要根据您的项目设置有条件地使用basic_ostringstream<char> 或basic_ostringstream<wchar_t>。但我离题了。
查看FormatMessage API 调用。它的使用有一些注意事项,例如系统是否为您分配内存,如果是,您需要删除缓冲区等。它有一些稍微不同的格式化选项。但它会做你想做的事。
在您的情况下,您可以编写一个方法来获取您的参数并将它们直接传递给DebugOutputString - 事实上,API 页面提供了一个返回格式化缓冲区的示例......您只需要记住 @ 987654328@使用后。
这是一个快速版本:
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。如果您指定宽度和其他东西,它会有点怪异,但查看文档应该会让您明白。