在VS2017中为OutputDebugString使用整数

时间:2018-03-25 02:34:23

标签: c++ debugging console visual-studio-2017 outputdebugstring

我一直在网上搜索一下如何使用OutputDebugString()输出整数或浮点数。 如果我可以使用此命令从我的外部可执行文件直接将调试数据写入控制台,那将更容易。但是我只能使用const char。 我发现的解决方案已经过时了我试着直接从网上复制和粘贴代码但是没有用。即使修改了代码,我也无法正确地进行类型转换。 是否有任何人可以帮助我在OutputDebugString中尽可能干净地进行类型转换,它仅用于调试目的,因此我宁愿保持代码简短且易于阅读,而不是具有更复杂和笨重的类型转换IF。非常感谢!

2 个答案:

答案 0 :(得分:1)

OutputDebugString只能接受字符串,如果你想要格式化输出,你必须在将它输入OutputDebugString之前自己做。如果您使用的是MSVC,我建议您使用_CrtDbgReport或_CrtDbgReportW。对于支持可变参数宏的最新版本的MSVC,我使用以下内容:

#if !defined(_RPTW)
#if defined(_DEBUG)
#define _RPTW(pszFmt, ...) _CrtDbgReportW(_CRT_WARN, NULL, __LINE__, NULL, (pszFmt), __VA_ARGS__)
#define _RPTW_(dest, fmt, ...) _CrtDbgReportW((dest), NULL, __LINE__, NULL, (pszFmt), __VA_ARGS__)
#else
#define _RPTW(pszFmt, ...)
#define _RPTW(dest, pszFmt)
#endif
#endif // #if !defined(_RPTW)

#if !defined(_RPTA)
#if defined(_DEBUG)
#define _RPTA(pszFmt, ...) _CrtDbgReport(_CRT_WARN, NULL, __LINE__, NULL, (pszFmt), __VA_ARGS__)
#define _RPTA_(dest, fmt, ...) _CrtDbgReport((dest), NULL, __LINE__, NULL, (pszFmt), __VA_ARGS__)
#else
#define _RPTA(pszFmt, ...)
#define _RPTA_(dest, pszFmt)
#endif
#endif // #if !defined(_RPTA)

#if !defined(_RPTT)
#if defined(_UNICODE)
#define _RPTT _RPTW
#define _RPTT_ _RPTW_
#else
#define _RPTT _RPTA
#define _RPTT_ _RPTA_
#endif
#endif // #if !defined(_RPTT)

第二种形式允许提供不同级别的报告(_CRT_ASSERT或c_CRT_ERROR而不是_CRT_WARN)

答案 1 :(得分:0)

提供替代解决方案。下面的函数封装了可以接受格式化参数的OutputDebugString。

#include <vector>
#include <string>    
void DbgMsg(const char * zcFormat, ...)
{
    // initialize use of the variable argument array
    va_list vaArgs;
    va_start(vaArgs, zcFormat);

    // reliably acquire the size
    // from a copy of the variable argument array
    // and a functionally reliable call to mock the formatting
    va_list vaArgsCopy;
    va_copy(vaArgsCopy, vaArgs);
    const int iLen = std::vsnprintf(NULL, 0, zcFormat, vaArgsCopy);
    va_end(vaArgsCopy);

    // return a formatted string without risking memory mismanagement
    // and without assuming any compiler or platform specific behavior
    std::vector<char> zc(iLen + 1);
    std::vsnprintf(zc.data(), zc.size(), zcFormat, vaArgs);
    va_end(vaArgs);
    std::string strText(zc.data(), iLen);

    OutputDebugStringA(strText.c_str());
}

例如,以下代码显示了如何通过DbgMsg()通过OutputDebugString打印整数变量。

int foo=12;
DbgMsg(" foo=%d", foo);