【问题标题】:c++ console in a non-console application project非控制台应用程序项目中的 c++ 控制台
【发布时间】:2012-06-20 13:13:55
【问题描述】:

我正在使用 C++ 编写 Windows 应用程序,我想使用 cout 进行调试。
cout 的效果似乎被隐藏了,是否有配置选项可以让控制台窗口打开并显示我的调试信息?

【问题讨论】:

  • @Sergey:不,这不是骗子。那是在询问与OutputDebugString 的写作。这不会/不会使cout 可用(尽管它是,IMO,一个完全有效的替代)。

标签: c++ windows visual-c++


【解决方案1】:

只需使用OutputDebugString(),但请记住将您的字符集设置为多字节,或者如果您不想这样做,您可以这样编写代码:

// with multibyte character set:

   OutputDebugString("Failed to do something");

// without multibyte character set:

   OutputDebugString(L"Failed to do something");

【讨论】:

    【解决方案2】:

    我相信接受的答案实际上并不是您想要的。你说你只需要它来调试,而不是发布。您的最佳选择是:

    a) 将stdoutstderr 重定向到一个文件,然后检查该文件。这个你可以在VS项目中设置Properties > Configuration Properties > Debugging > Command Arguments:你应该输入>out.txt 2>&1。这会将stdoutstderr 都输出到out.txt

    b) 将你的调试(你说你只需要它用于调试)配置Properties > Configuration Properties > Linker > System > SubSystem 设置为Console (/SUBSYSTEM:CONSOLE)。然后您可以使用F5 运行该项目,但是当您的应用程序完成时它会隐藏控制台窗口。如果你用Ctrl+F5 运行它(但是你不会附加调试器),那么它就不会被隐藏。

    【讨论】:

      【解决方案3】:

      从 GUI 程序管理控制台非常混乱,我建议你用另一种方式来做。例如,如果您需要实时查看消息,则将它们显示在窗口中;如果没有,请将它们写入文件。

      【讨论】:

        【解决方案4】:

        最简单的方法是从头开始启动控制台应用程序:

        在 VisualStudio 中,文件 > 新建项目。选择 Win32 控制台应用程序。选择各种选项并创建新项目。

        请注意,虽然它说的是 Win32 控制台应用程序,但您可以不受限制地创建 x64 版本。

        此时您已经有了一个应用程序外壳。如果您已经有代码并且想要将其引入这个新项目,只需执行 Project > Add Existing Item... 并选择要包含在项目中的文件.

        【讨论】:

        • 我相信这对于现有的非控制台项目来说是不可行的解决方案。有更好的解决方案可用。
        【解决方案5】:

        您有几个合理的选择。一种是将您的入口点从WinMain 重命名为main,以便将其构建为控制台应用程序。那仍然可以使用RegisterClassCreateWindow 之类的东西就好了。

        显而易见的替代方法是使用OutputDebugString 而不是cout。其输出将显示在调试器中,或者任何数量的专门为显示其生成的程序而构建的程序中(基本上是不提供其他调试功能的小型调试器)。

        我认为不太合理的第三种解决方案是调用AllocConsole 来分配一个控制台,然后写入它。如果您不介意使用 Windows 原生控制台函数(WriteFileWriteConsoleOutput 等)进行所有写作,那很好。不幸的是,它不会初始化 C++ 流以与控制台一起使用,因此您需要打开指向控制台的文件流,或者找到并使用为控制台初始化流库的(未记录的)函数。虽然这可以工作,但您最终会做额外的工作来编写不可移植的代码,并且几乎没有(如果有的话)可以弥补它(在这种情况下,“不可移植”甚至可能包括不使用同一编译器的其他版本,至少在您调用库的初始化函数时)。

        【讨论】:

        • 重定向cout 非常便携。我想你最终会得到两行 Windows 特定代码——一行调用AllocConsole,另一行包含特殊文件名"CONOUT$"。我根本不认为OutputDebugString 是一个可行的替代方案,因为它不支持任何格式,更不用说与为iostreams 设计的功能兼容了。
        • @BenVoigt:使用vsprintf 格式化的前端,然后使用OutputDebugString 是微不足道的。一个 overflow 使用 OutputDebugstring 的 straebuf 不是 相当 微不足道的,但仍然不完全是火箭科学。
        • 如果你不关心可能的缓冲区溢出,使用vsprintf只是微不足道的。
        • @BenVoigt:调试输出的问题有多频繁?至少根据我的经验(诚然有限——只有 3 年左右),答案是“从不”。
        • 取决于你在调试什么,我想。如果您遇到输入字符串未正确以 NUL 结尾的问题,或者文件使用了错误的行结尾,因此被视为一大行而不是许多短行,我可以轻松想象数据发送到调试输出的位置可能比设计的要大得多。毕竟,当输入与预期不同时,调试信息最有用。
        【解决方案6】:

        要将控制台窗口添加到 GUI 应用程序,您可以使用 AllocConsole API。

        然后您只需打开特殊文件名"CONOUT$" 并将您的流附加到它(coutcerr 等)

        请参阅 MSDN 上的 this explanation

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-01-18
          • 1970-01-01
          • 1970-01-01
          • 2011-04-20
          • 2014-02-17
          • 2010-11-04
          • 1970-01-01
          相关资源
          最近更新 更多