3

我正在使用 C++ 开发一个 Windows 应用程序,我想cout用于调试目的。
似乎 的效果cout被隐藏了,是否有一个配置选项可以让控制台窗口打开我的调试信息?

4

6 回答 6

2

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

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

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

于 2012-06-18T14:35:55.327 回答
2

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

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

请参阅MSDN 上的此说明

于 2012-06-18T14:39:49.233 回答
1

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

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

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

于 2017-03-15T08:18:40.087 回答
0

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

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

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

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

于 2012-06-18T14:37:00.850 回答
0

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

于 2012-06-18T15:01:02.353 回答
0

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

// with multibyte character set:

   OutputDebugString("Failed to do something");

// without multibyte character set:

   OutputDebugString(L"Failed to do something");
于 2021-09-21T08:30:41.403 回答