关于VS运行结果窗口的保留及屏蔽操作
1、保留运行结果窗口
针对vs运行结果窗口总是一闪而过的问题,这里介绍下常用的三种解决方案:
1.1、使用DOS指令pause进行窗口暂停
可以在函数return之前加上如下代码,"system"表示系统调用;"pause"是DOS指令,用于函数的暂停。当程序运行到该行代码时,则会进行暂停,并在当前窗口提示"请按任意键继续";并等待我们按下任意键之后再继续执行下面的代码。
system("pause");
1.2、使用getchar()函数进行窗口保留
可以在函数return之前加上如下代码。当程序运行到该行代码时,会停留在当前处并等待用户输入字符(该函数最后是以回车键作为输入结束标志),当我们按下回车键后再继续执行下面的代码。
getchar();
1.3、通过对工程子系统属性设置为控制台来实现
如下,对当前工程的子系统属性进行设置:
项目->属性->配置属性->链接器->系统->子系统->选择"控制台(/SUBSYSTEM:CONSOLE)"
2、屏蔽运行结果窗口显示的方法
当我们不想要工程运行时弹出运行窗口(例如做成dll文件时对大量调试用的printf打印信息进行屏蔽),可以通过以下两种方式来解决。
2.1、使用#pragma comment设置连接器选项
在文件中加上如下的预处理指令,对DOS窗口进行显示屏蔽。
#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
(1)、连接器的“/subsystem:”选项参数用于告诉操作系统如何运行.exe文件,可以指定如下的四种方式:
- CONSOLE:控制台;
- WINDOWS:窗口;
- NATIVE:本地;
- POSIX;
当这个选项参数的值为“WINDOWS”,则表示该应用程序运行时不需要控制台,则此时不会显示控制台运行窗口。
(2)、连接器的“/entry:”选项参数用于设置程序的入口函数;在VC下,连接器对控制台程序设置的入口函数是 mainCRTStartup,mainCRTStartup 再调用我们编写的 main 函数。所以,在上面的指令中,我们程序的入口函数还是我们写的main()函数;当然,我们也可以将其改成其他我们程序中定义的函数;则此时程序运行的入口点不再是main()函数,而是我们“/entry:”后面的函数。
2.2、通过对工程子系统属性设置为窗口来实现
对当前工程按照如下步骤进行设置:
(1)、项目->属性->配置属性->链接器->系统->子系统->选择"窗口(/SUBSYSTEM:WINDOWS)";
(2)、项目->属性->配置属性->链接器->高级->入口点->输入mainCRTStartup(程序的入口函数,这里也可以设置为其他程序中定义的函数名,但建议还是设置为mainCRTStartup)
其实这两种方法是一致的,第一种也是通过预处理指令对工程的子系统属性进行设置;第二种则是直接在编译器上对工程的子系统属性进行设置。
总结
1、针对vs运行结果窗口总是一闪而过的问题,有如下三种方式解决:
- 在函数return前加上 system(“pause”); 指令;
- 在函数return前加上 getchar(); 函数;
- 通过"项目->属性->配置属性->链接器->系统->子系统->选择"控制台""进行设置;
2、当我们不想要工程运行时弹出窗口显示,有以下两种方式来解决:
- 加上预处理指令 #pragma comment( linker, “/subsystem:“windows” /entry:“mainCRTStartup”” )
- 通过更改工程子系统属性为窗口并设置好入口函数来实现