运行MFC应用程序时,是否有方法输出到;控制台;? 我习惯于在Qt创建者中用C++开发,比VisualStudio更为先进。在前者中,你可以这样做 qDebug()<< my_trace_string; qDebug()

运行MFC应用程序时,是否有方法输出到;控制台;? 我习惯于在Qt创建者中用C++开发,比VisualStudio更为先进。在前者中,你可以这样做 qDebug()<< my_trace_string; qDebug(),c++,debugging,visual-studio-2017,mfc,C++,Debugging,Visual Studio 2017,Mfc,在Visual Studio中处理GUI程序时,通常的方法是使用_RPTX(其中X是varadic参数的数量)宏,当报告类型为_CRT_WARN时,该宏将打印到VS本身的输出窗口,而不是使用外部控制台窗口 例如: _RPT1(_CRT_WARN, __FUNCTION__ ": hWnd: %#x\r\n", m_hWnd); 就我个人而言,我更喜欢使用以下不采用报告类型的(自定义)宏(我简单地使用了_CRT_WARN),也不需要知道vararg参数的数量,也不需要使用4个以上的vararg参

在Visual Studio中处理GUI程序时,通常的方法是使用_RPTX(其中X是varadic参数的数量)宏,当报告类型为_CRT_WARN时,该宏将打印到VS本身的输出窗口,而不是使用外部控制台窗口

例如:

_RPT1(_CRT_WARN, __FUNCTION__ ": hWnd: %#x\r\n", m_hWnd);
就我个人而言,我更喜欢使用以下不采用报告类型的(自定义)宏(我简单地使用了_CRT_WARN),也不需要知道vararg参数的数量,也不需要使用4个以上的vararg参数(默认宏的限制)。RPT宏从未更新过,以利用可变宏功能预处理器:

#if !defined(_RPTW)
#if defined(_DEBUG)
#define _RPTW(pszFmt, ...) _CrtDbgReportW(_CRT_WARN, NULL, __LINE__, NULL, (pszFmt), __VA_ARGS__)
#define _RPTWF(dest, fmt, ...) _CrtDbgReportW((dest), _T(__FILE__), __LINE__, NULL, (pszFmt), __VA_ARGS__)
#else
#define _RPTW(pszFmt, ...)
#define _RPTWF(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 _RPTAF(dest, fmt, ...) _CrtDbgReport((dest), __FILE__, __LINE__, NULL, (pszFmt), __VA_ARGS__)
#else
#define _RPTA(pszFmt, ...)
#define _RPTAF(dest, pszFmt)
#endif
#endif // #if !defined(_RPTA)

#if !defined(_RPTT)
#if defined(_UNICODE)
#define _RPTT _RPTW
#define _RPTTF _RPTWF
#else
#define _RPTT _RPTA
#define _RPTTF _RPTAF
#endif
#endif // #if !defined(_RPTT)
使用自定义宏,原始示例变为:

_RPTA(__FUNCTION__ ": hWnd: %#x\r\n", m_hWnd);
最初的方法确实有将报告类型作为参数的好处,使用该输出可以重定向到窗口(如断言)、输出窗口(带有警告的默认窗口)或跟踪文件(需要调用CrtSetReportMode和CrtSetReportFile)。

outputDebutString()
from
debuapi.h
(just
#include
)是您的朋友。我通常将其包装成这样的函数(ASCII使用a后缀,UNICODE使用W后缀):

将输出到IDE中的
output
窗口(在
调用堆栈
错误列表
和其他旁边)

  • 首先,您可以尝试调用为流程创建控制台
  • 将您的输出通过发送到控制台,并且不要忘记在使用
    \u cprintf()的任何地方都包括在内
  • 如果需要关闭控制台输出,请调用

  • 有关更多详细信息,您可以参考

    ,这取决于您是使用windows.h来生成windows可执行文件,还是正在生成其他类型的项目。对于windows可执行文件,MFC程序中的情况如何,您还可以使用来输出调试信息。跟踪宏可以在de期间将调试信息输出到输出窗口窃听。这看起来很有趣,因为专用的输出控制台将不受来自应用程序的不太有趣的消息的干扰。
    void dbgMsg(PCWSTR _format, ...)
    {
        va_list args;
        va_start(args, _format);
    
        WCHAR msg[MAX_PATH];
    
        if(SUCCEEDED(StringCbVPrintfW(msg, sizeof(msg), _format, args))){
            OutputDebugStringW(msg);
        }
    }