我正在尝试为K&R“Hello,world”构build一个.exe文件。 书中给出的代码是:
#include <stdio.h> main() { printf("Hello,world!n"); }
当我从Code :: Blocks(在Windows XP下)中构build&运行时,我得到了“hello world”消息的提示窗口。 它保持打开,直到我手动closures它。 但是,当我双击.exe文件,提示只是闪烁和消失,为什么呢?
fork()和STDOUT / STDERR从subprocess到控制台
隐藏进程窗口,为什么它不工作?
如何configurationwin32的rcp产品在控制台上正确打印德文变音符号?
当使用CREATE_NEW_PROCESS_GROUP创build主机时,将Ctrl + C发送给subprocess
如何连接控制台应用程序和Windows窗体应用程序C#
没有人明确地告诉你这一点,所以我会:
双击文件时看到的是正常的 。 你的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; }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。