gpt4 book ai didi

c++ - 如何从 Visual Studio 将标准输出重定向到输出窗口

转载 作者:IT老高 更新时间:2023-10-28 21:47:46 26 4
gpt4 key购买 nike

是否可以从 Visual Studio 将标准输出重定向到输出窗口?

我在我的程序中使用 OutputDebugString,但我使用了一些库,这些库通过 printf 或 cout 输出调试消息。

最佳答案

来自 Redirecting cerr and clog to OutputDebugString() :

#include <ostream>
#include <Windows.h>

/// \brief This class is derives from basic_stringbuf which will output
/// all the written data using the OutputDebugString function
template<typename TChar, typename TTraits = std::char_traits<TChar>>
class OutputDebugStringBuf : public std::basic_stringbuf<TChar,TTraits> {
public:
explicit OutputDebugStringBuf() : _buffer(256) {
setg(nullptr, nullptr, nullptr);
setp(_buffer.data(), _buffer.data(), _buffer.data() + _buffer.size());
}

~OutputDebugStringBuf() {
}

static_assert(std::is_same<TChar,char>::value ||
std::is_same<TChar,wchar_t>::value,
"OutputDebugStringBuf only supports char and wchar_t types");

int sync() try {
MessageOutputer<TChar,TTraits>()(pbase(), pptr());
setp(_buffer.data(), _buffer.data(), _buffer.data() + _buffer.size());
return 0;
}
catch(...) {
return -1;
}

int_type overflow(int_type c = TTraits::eof()) {
auto syncRet = sync();
if (c != TTraits::eof()) {
_buffer[0] = c;
setp(_buffer.data(), _buffer.data() + 1, _buffer.data() + _buffer.size());
}
return syncRet == -1 ? TTraits::eof() : 0;
}


private:
std::vector<TChar> _buffer;

template<typename TChar, typename TTraits>
struct MessageOutputer;

template<>
struct MessageOutputer<char,std::char_traits<char>> {
template<typename TIterator>
void operator()(TIterator begin, TIterator end) const {
std::string s(begin, end);
OutputDebugStringA(s.c_str());
}
};

template<>
struct MessageOutputer<wchar_t,std::char_traits<wchar_t>> {
template<typename TIterator>
void operator()(TIterator begin, TIterator end) const {
std::wstring s(begin, end);
OutputDebugStringW(s.c_str());
}
};
};

然后:

int main() {
#ifndef NDEBUG
#ifdef _WIN32
static OutputDebugStringBuf<char> charDebugOutput;
std::cerr.rdbuf(&charDebugOutput);
std::clog.rdbuf(&charDebugOutput);

static OutputDebugStringBuf<wchar_t> wcharDebugOutput;
std::wcerr.rdbuf(&wcharDebugOutput);
std::wclog.rdbuf(&wcharDebugOutput);
#endif
#endif

...

// Will be displayed in the debugger
std::cerr << "Error: something bad happened" << std::endl;

...
}

你可能想用它来

IsDebuggerPresent()

这样它在不从 Visual Studio 调试器运行时仍会输出到控制台。

关于c++ - 如何从 Visual Studio 将标准输出重定向到输出窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5248704/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com