为什么我的程序输出在Windows中闪烁并closures?

我正在尝试为K&R“Hello,world”构build一个.exe文件。 书中给出的代码是:

#include <stdio.h> main() { printf("Hello, world!\n"); } 

当我从Code :: Blocks(在Windows XP下)中构build&运行时,我得到了“hello world”消息的提示窗口。 它保持打开,直到我手动closures它。 但是,当我双击.exe文件,提示只是闪烁和消失,为什么呢?

没有人明确地告诉你这一点,所以我会:

双击文件时看到的是正常的 你的IDE做什么(保持窗口打开)是一个帮助你调试应用程序的功能。

这是为什么?

由于您正在开发控制台应用程序,因此您的应用程序必须有一个控制台才能显示其输出。 如果还没有,则会创建一个新的控制台(这是黑色的窗口)。

如果您从控制台(例如,从cmd.exe )启动程序,它将继承父级的控制台而不创建新的[1]。

在最后一个使用控制台的应用程序退出之后(在第一种情况下只是你的程序),控制台关闭。 您将一直注意到,这些控制台应用程序在没有参数的情况下运行时只会显示帮助文本。 如果您从资源管理器中双击它们,带有文本的黑色窗口将会闪烁,然后立即关闭。

  • 有时候,一个能够立即关闭的程序就是你想要的。 例如,您可以从脚本调用这些应用程序。

  • 另一方面,您的应用程序可以是交互式的:等待用户输入,做一些事情,只有当用户告诉它时退出。 显然,您不能编写这些应用程序的脚本,因为您需要在键盘上放置一个人员来告诉应用程序执行什么操作。

现在我们进入IDE部分:假设您正在开发第一种应用程序,一种做了一些事情,然后马上关闭。 屏幕闪烁并不是每次运行都会很方便,因为如何判断程序是否工作? 假设你可以从它产生的输出中看出来。

您当然可以启动一个命令行窗口并从那里运行应用程序,但程序将与IDE分开执行,您将失去实时调试功能。

因此,IDE制造商提出了一个控制台应用程序的功能:当您直接从IDE运行应用程序时,他们通常会等待按键。 这使您有机会检查输出的窗口,以确认应用程序正常工作。


[1]秘籍:除非你通过一个不继承控制台的应用程序。 由该应用程序启动的任何控制台应用程序都不会继承控制台,因为继承已被GUI应用程序中断。 例如, start.exe执行此操作。 比较:

 foo.exe (inherits the console) start foo.exe (start.exe is a GUI app, so foo.exe is launched in a new console) 

如果你没有从一个已经打开的命令行窗口运行一个命令行exe,Windows会在程序终止后自动关闭窗口。 尝试打开cmd.exe,导航到您的程序的目录,并从那里运行,窗口应该保持打开状态。

当从这样的IDE运行时,他们运行该程序,当它完成运行时,他们关闭它。

由于你的程序的唯一功能是打印出一个值,它会这样做,并关闭。

您应该尝试添加一些要求在最后输入用户信息或将其编译为.exe文件并自行从命令行自行运行。

既然你开始了,我会建议你自己从命令行运行它。 您将最终了解用户输入,并且您可以在使用程序时打开命令行窗口。

正常的行为。

你的程序按照主要的顺序执行每一个动作。 所以它打印,然后移动到下一个操作,没有,所以它退出。 由于控制台窗口绑定到您的.exe,命令窗口与程序关闭。

如果你不想让你的程序立即退出,你可以让它休眠,或者在退出之前等待用户输入。

在Windows中双击.exe时,您正在启动一个新的进程。 Windows有两种基本的进程类型:Window和Command line。 你写的hello world样本是一个命令行过程。

命令行进程将在启动时启动一个新的命令窗口。 这是弹出的窗口,主要是黑色的背景,白色的文字。 程序完成后,窗口将关闭。

添加getch(); 在大括号之前。 这将在输出打印后提示输入。 一旦你输入一个字符,窗口将关闭。 这应该可以解决你的问题。

首选的解决方案是从命令行运行可执行文件。

尝试从命令行运行你的二进制文件。

那是因为可执行文件打开了自己的对话框。 当可执行文件完成运行时,它会关闭为了运行而打开的对话框。 但是,如果您是打开对话框的那个,则关闭它时会消失。

所以,如果打开命令提示符并运行可执行文件,对话框将不会自动关闭。

这是因为从可执行文件中,它在一个新的窗口中执行你的代码,然后这个过程完成了,没有理由保持打开,你想要做的是完整的。 有几件事你可以做。 您可以从cmd.exe命令行执行它,或者甚至可以在代码的末尾添加一些侦听按键操作的内容,一旦检测到关键笔划,就允许程序退出。

只需添加

 system("pause"); 

在返回之前。 这不是最好的,而是通用的方法。

这是我的承担:

 // Hello sweetie (Spoilers) #include <iostream> using namespace std; int main() { // Print the text to screen cout << "************************************"; cout << "\n"; cout << "Hello World!"; cout << "\n"; cout << "You may close me by pressing Enter"; cout << "\n"; cout << "************************************"; cout << "\n"; cout << "\n"; /* This will prompt for an input after the output is printed. Once you hit the Enter key the window will close. */ if (cin.get() == '\n') return 0; }