默认的Win32
窗口程序(subsystem:Windows),入口点为WinMain
的程序是不会显示Console终端的,意味着std::cout
一系列的函数都不能用。
要想在执行程序的时候同时打开黑框(Console)有两种方式
改变Link符号和入口点
可以通过以下的链接指令修改入口点到mainCRTStartup
,也可以在Properties->Linker->System->Subsystem
里修改为Console
,这样入口点也会调整到mainCRTStartup
。
#ifdef _MSC_VER
# pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup")
#endif
此时程序启动的时候会正常调用int main
函数,相较于winMain
函数其主要少了重要的hInstance
参数,可以通过GetModuleHandle(0)
获得当前窗口的hInstance
。
int main()
和winMain()
的区别可以见: 程序入口函数 main 和 WinMain
int main()
{
auto hInstance = GetModuleHandle(0);
GameApp theApp(hInstance);
HINSTANCE prev = NULL;
LPSTR cmdline = GetCommandLineA();
int showCmd;
if (!theApp.Init())
return 0;
return theApp.Run();
}
在WinMain函数里重新启用Console
还有一种方式是在WinMain
函数里重新启用Console,注意最好在其他代码运行前启用。
需要启用宏#define _CRT_SECURE_NO_WARNINGS
,或者用微软的私活freopen_s
。
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <iostream>
int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE prevInstance,
_In_ LPSTR cmdLine, _In_ int showCmd)
{
//注意这块
AllocConsole();
freopen("CONIN$", "r", stdin);
freopen("CONOUT$", "w", stdout);
freopen("CONOUT$", "w", stderr);
std::cout << "Hello\n"; //you should see this on the console
// other code
GameApp theApp(hInstance);
if (!theApp.Init())
return 0;
return theApp.Run();
}