Почему моя программа выводится на экран и закрывается в Windows?

Я пытаюсь создать .exe файл для K & R "Hello, world". Код, указанный в книге:

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

Когда я создаю и запускаю из Code:: Blocks (под Windows XP), я получаю окно с сообщением "hello world". Он остается открытым, пока я не закрою его вручную. Однако, когда я дважды щелкаю файл .exe, подсказка просто мигает и исчезает, почему?

Ответ 1

Никто явно не говорит вам об этом, поэтому я:

То, что вы видите при двойном щелчке по файлу, является нормальным. Что делает ваша IDE (поддерживая открытое окно) - это функция, которая поможет вам отлаживать приложение.

Почему это так?

Поскольку вы разрабатываете консольное приложение, для вашего приложения должна быть консоль для отображения ее вывода. Если его еще нет, создается новая консоль (это черное окно).

Если вы запускаете свою программу из консоли (скажем, от cmd.exe), она просто наследует консоль родителя, не создавая новую [1].

После последнего приложения, использующего консольные выходы (который в первом случае является вашей программой), консоль закрывается. Вы заметите это все время для консольных приложений, которые печатают только текст справки при запуске без параметров. Если вы дважды щелкните их из проводника, появится черное окно с некоторым текстом, а затем сразу же закроется.

  • Иногда программа, которая что-то делает, и они немедленно закрываются, - это то, что вы хотите. Например, вы можете вызывать эти приложения из сценариев.

  • С другой стороны, ваше приложение может быть интерактивным: ждать ввода пользователя, делать что-то и только выходить, когда пользователь ему это скажет. Вы не можете script этих приложений, очевидно, так как вам нужно будет присутствовать на клавиатуре, чтобы сообщить приложению, что делать.

Теперь мы перейдем к части IDE: скажем, вы разрабатываете приложение первого рода, которое делает что-то, а затем немедленно закрывается. Не очень удобно, чтобы экран вспыхивал и исчезал каждый раз, когда вы его запускали, потому что, как вы можете определить, работает ли программа? Предполагая, что вы можете сообщить об этом на выходе, который он генерирует.

Конечно, вы можете запустить окно командной строки и запустить приложение оттуда, но программа будет выполняться отдельно от среды IDE, и вы потеряете возможности активной отладки.

Итак, разработчики IDE придумали функцию для консольных приложений: при запуске приложения непосредственно из вашей среды IDE они впоследствии, как правило, ждут нажатия клавиши. Это дает вам возможность проверить окно с выходом, чтобы убедиться, что приложение работает правильно.


[1] Esoterica: если вы не проходите через приложение, которое не наследует консоль. Любое консольное приложение, запущенное этим приложением, не наследует консоль, поскольку наследование было нарушено графическим интерфейсом. Например, 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)

Ответ 2

Если вы не используете командную строку exe из уже открытого окна командной строки, Windows автоматически закроет окна после завершения программы. Попробуйте открыть cmd.exe, перейдя в свою директорию программы и запустив ее оттуда, окно должно оставаться открытым.

Ответ 3

При запуске из IDE, как это, они запускают программу, и когда ее выполнение выполняется, они закрывают ее.

Поскольку ваша функция только для печати предназначена для печати значения, она делает это и закрывается.

Вам следует попытаться добавить что-то, что запрашивает ввод пользователя в конце или скомпилировать его в .exe и запустить сам из командной строки.

Поскольку вы начинаете, я бы рекомендовал просто запустить его из командной строки самостоятельно. В конце концов вы узнаете о пользовательском вводе, и там, где вы используете свою программу, вы можете открыть окно командной строки.

Ответ 4

Нормальное поведение.

Ваша программа выполняет каждое действие в порядке основного. Таким образом, он печатает, а затем переходит к следующей операции, нет, поэтому он выходит. Поскольку консольное окно привязано к вашему .exe, окно командной строки закрывается программой.

Если вы не хотите, чтобы ваша программа сразу уходила, вы можете заставить ее спать или ждать ввода пользователя перед выходом.

Ответ 5

При двойном щелчке на .exe в Windows вы запускаете новый процесс. Windows имеет два основных типа процесса: Окно и Командная строка. Образец приветствия, который вы написали, представляет собой процесс командной строки.

Процесс командной строки запустит новое окно командной строки при запуске. Это окно, которое всплывает, что в значительной степени является черным фоном с белым текстом. По завершении программы окно закроется.

Ответ 6

Добавьте getch(); перед закрывающей скобкой. Это вызовет ввод после выхода. Когда вы закроете символ, окно закроется. Это должно решить вашу проблему.

Ответ 7

Предпочтительным решением является запуск исполняемого файла из командной строки.

Ответ 8

Попробуйте запустить двоичный файл из командной строки.

Ответ 9

Это потому, что исполняемый файл открывает свое собственное диалоговое окно. Когда исполняемый файл завершит выполнение, он отключит открытое диалоговое окно для запуска. Однако, когда вы открываете диалоговое окно, оно исчезает, когда вы его закрываете.

Итак, если вы должны открыть командную строку, а затем запустить исполняемый файл, диалоговое окно не будет автоматически закрыто.

Ответ 10

Это потому, что из исполняемого файла он выполняет ваш код в новом окне, а затем процесс завершен, у него нет причин оставаться открытым, то, что вы хотели сделать, завершено. Есть несколько вещей, которые вы можете сделать. Вы можете выполнить его из командной строки cmd.exe, или вы можете даже поместить что-то в конец вашего кода, который прослушивает нажатие клавиши, и после того, как будет обнаружен ход клавиши, разрешите программе выйти.

Ответ 11

просто добавьте

system("pause");

перед возвратом. это не лучший, но универсальный метод.

Ответ 12

Вот мой пример:

// 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;
}