运行MFC应用程序时,有没有一种输出到“控制台”的方法?

时间:2019-11-13 20:56:08

标签: c++ debugging visual-studio-2017 mfc

我习惯于在Qt Creator中使用C ++进行开发,比Visual Studio更为重要。在前者中,您可以执行以下操作

qDebug()<< my_trace_string; 

将my_trace_string输出到一个方便的“控制台”,以便您查看发生了什么。 我想知道是否存在一个Visual Studio窗口,应用程序可以独立于对话框和控件轻松地向其写入。这是对调试器的补充。例如,它留下了视觉痕迹。

3 个答案:

答案 0 :(得分:3)

来自OutputDebugString()(只是debuapi.h)的

#include <windows.h>是您的朋友。我通常将其包装成这样的函数(对于ASCII使用 A 后缀,对于UNICODE使用 W 后缀):

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);
    }
}

这将输出到IDE中的Output窗口(Call stackError List等之后) enter image description here

答案 1 :(得分:2)

在Visual Studio中,当使用GUI程序时,通常的方法是使用_RPTX(其中X是变量参数的数量)宏,当报表类型为_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);

原始方法的确具有将报告类型作为参数的好处,使用该输出可以重定向到窗口(如_ASSERT一样),输出窗口(具有_CRT_WARN的默认值)或跟踪文件(要求调用_CrtSetReportMode和_CrtSetReportFile)。

答案 2 :(得分:1)

  1. 首先,您可以尝试调用AllocConsole function为您的流程创建控制台。
  2. 通过_cprintf()将输出发送到控制台,并且不要忘记在使用SUPPLIER_GROUP_ATTRS = [ "id", "count(products) as completed_products_count" ] SupplierGroup.left_joins(:products).where("products.state=?","completed").select(SUPPLIER_GROUP_ATTRS).group(:id) 的任何地方包含#include
  3. 如果您需要关闭控制台输出,请致电FreeConsole();

有关更多详细信息,请参阅this link