我正在使用 C++ 开发一个 Windows 应用程序,我想cout
用于调试目的。
似乎 的效果cout
被隐藏了,是否有一个配置选项可以让控制台窗口打开我的调试信息?
6 回答
你有几个合理的选择。一种是将入口点从 重命名WinMain
为main
,以便将其构建为控制台应用程序。那仍然可以使用RegisterClass
和CreateWindow
就好了。
显而易见的替代方法是使用OutputDebugString
而不是cout
. 其输出将显示在调试器中,或者任何数量的专门为显示其产生的程序而构建的程序中(基本上是不提供其他调试功能的小型调试器)。
我认为不太合理的第三种解决方案是调用AllocConsole
分配一个控制台,然后写入它。如果您不介意使用 Windows 原生控制台函数(、、等)进行所有写作,WriteFile
那WriteConsoleOutput
很好。不幸的是,它不会初始化 C++ 流以与控制台一起使用,因此您需要打开指向控制台的文件流,或者找到并使用为控制台初始化流库的(未记录的)函数。虽然这可以工作,但您最终会做额外的工作来编写不可移植的代码,并且几乎没有(如果有)弥补它的优势(在这种情况下,“不可移植”甚至可能包括不使用同一编译器的其他版本,至少在您调用库的初始化函数时)。
要将控制台窗口添加到 GUI 应用程序,您可以使用AllocConsole
API。
然后您只需要打开特殊文件名"CONOUT$"
并将您的流附加到它(cout
,cerr
等)
请参阅MSDN 上的此说明。
我相信接受的答案实际上不是您想要的。你说你只需要它来调试,而不是发布。您的最佳选择是:
a) 重定向stdout
到stderr
一个文件,然后检查该文件。这个你可以在 VS 项目中设置Properties > Configuration Properties > Debugging > Command Arguments
:你应该输入>out.txt 2>&1
. 这将输出stdout
和stderr
out.txt
b)将您的调试(您说您只需要它用于调试)配置Properties > Configuration Properties > Linker > System > SubSystem
设置为Console (/SUBSYSTEM:CONSOLE)
. 然后您可以使用 运行该项目F5
,但是当您的应用程序完成时它将隐藏控制台窗口。如果你运行它Ctrl+F5
(但你不会附加调试器),那么它不会被隐藏。
最简单的方法是从头开始启动控制台应用程序:
在 VisualStudio 中,文件>新建项目。选择Win32 控制台应用程序。选择各种选项并创建新项目。
请注意,虽然它说的是Win32控制台应用程序,但您可以不受限制地创建 x64 版本。
此时您有一个应用程序外壳。如果您已经有代码并且想要将其引入这个新项目,只需执行Project > Add Existing Item...并选择要包含在项目中的文件。
从 GUI 程序管理控制台是非常混乱的,我建议你用另一种方式来做。例如,如果您需要实时查看消息,则将它们显示在窗口中;如果没有,请将它们写入文件。
只需使用OutputDebugString()
,但请记住将您的字符集设置为多字节,或者如果您不想这样做,您可以这样编写代码:
// with multibyte character set:
OutputDebugString("Failed to do something");
// without multibyte character set:
OutputDebugString(L"Failed to do something");