我正在尝试为K& R“Hello,world”构建一个.exe文件。书中给出的代码是:
#include <stdio.h>
main()
{
printf("Hello, world!\n");
}
当我建立&amp;从Code :: Blocks(在Windows XP下)运行,我得到带有“hello world”消息的提示窗口。它会一直打开,直到我手动关闭它。但是,当我双击.exe文件时,提示只是闪烁并消失,为什么会这样?
答案 0 :(得分:20)
没有人明确告诉你这个,所以我会:
双击文件时看到的内容是正常。您的IDE所做的事情(保持窗口打开)是一个功能,可帮助您调试应用程序。
为什么会这样?
由于您正在开发控制台应用程序,因此您的应用程序必须有一个控制台才能显示其输出。如果还没有,则创建一个新的控制台(黑色窗口)。
如果从控制台内部(例如,从cmd.exe
)启动程序,它将继承父级的控制台而不创建新的[1]。
在使用控制台退出的最后一个应用程序(在第一种情况下只是您的程序)之后,控制台关闭。您将一直注意到这个控制台应用程序在没有参数的情况下运行时只打印帮助文本。如果从资源管理器中双击它们,带有一些文本的黑色窗口将闪烁,然后立即关闭。
有时,做某事的程序会立即关闭,这就是你想要的。例如,您可以从脚本中调用这些应用程序。
另一方面,您的应用程序可以是交互式的:等待用户输入,做某事,并且仅在用户告知时退出。显然,你不能编写这些应用程序的脚本,因为你需要在键盘上有一个人来告诉应用程序该做什么。
现在我们进入IDE部分:让我们说你正在开发第一种应用程序,一种做某事然后立即关闭的应用程序。屏幕闪烁不是很方便,每次运行都会消失,因为如何判断程序是否有效?假设您可以从它生成的输出中告诉它。
您当然可以启动命令行窗口并从那里运行应用程序,但程序将与IDE分开执行,您将失去实时调试功能。
因此,IDE制造商想出了一个控制台应用程序的功能:当您直接从IDE运行应用程序时,他们会在等待按键时使用。这使您有机会使用输出检查窗口,以确认应用程序正常工作。
[1] Esoterica:除非您通过不继承控制台的应用程序。该应用程序启动的任何控制台应用程序都不会继承控制台,因为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)
答案 1 :(得分:17)
如果您没有从已经打开的命令行窗口运行命令行exe,Windows将在程序终止后自动关闭窗口。尝试打开cmd.exe,导航到程序目录并从那里运行,窗口应保持打开状态。
答案 2 :(得分:4)
当从这样的IDE运行时,它们运行程序,当它完成运行时,它们会关闭它。
由于程序的唯一功能是打印出一个值,它会这样做并关闭。
您应该尝试在最后添加一些要求用户输入的内容,或者将其编译成.exe并自行从命令行运行。
由于您正在开始,我建议您自己从命令行运行它。您最终将了解用户输入,并且在使用程序时可以打开命令行窗口。
答案 3 :(得分:3)
正常行为。
您的程序按照主要顺序执行每个操作。所以它打印,然后继续下一个操作,没有,所以它退出。由于控制台窗口与.exe绑定,因此命令窗口将以程序关闭。
如果您不希望程序立即退出,可以让它休眠,或在退出前等待用户输入。
答案 4 :(得分:3)
在Windows中双击.exe时,您将启动一个新进程。 Windows有两种基本过程类型:窗口和命令行。您编写的hello world示例是命令行进程。
命令行进程将在启动时启动新的命令窗口。这是弹出的窗口,主要是带有白色文本的黑色背景。完成程序后,窗口将关闭。
答案 5 :(得分:2)
在右大括号前添加getch();
。这将在打印输出后提示输入。键入一个字符后,窗口将关闭。这应该可以解决您的问题。
答案 6 :(得分:1)
首选解决方案是从命令行运行可执行文件。
答案 7 :(得分:1)
尝试从命令行运行二进制文件。
答案 8 :(得分:1)
这是因为可执行文件打开了自己的对话框。当可执行文件完成运行时,它会关闭它打开的对话框以便运行。但是,当您打开对话框时,它会在您关闭它时消失。
因此,如果要打开命令提示符然后运行可执行文件,对话框将不会自动关闭。
答案 9 :(得分:1)
这是因为从可执行文件中,它在一个新窗口中执行您的代码,然后该过程完成,它没有理由保持打开状态,您想要做的是完成。你可以做几件事。您可以从cmd.exe命令行执行它,或者甚至可以在代码末尾添加一些内容来监听按键,一旦检测到按键,就允许程序退出。
答案 10 :(得分:0)
只需添加
system("pause");
退货之前行。它不是最好的,而是普遍的方法。
答案 11 :(得分:0)
以下是我对此的看法:
// 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;
}