Как сохранить окно консоли открытым в Visual C++?

Я начинаю в Visual C++ , и я хотел бы знать, как сохранить окно консоли.

например, это будет типичное приложение "hello world":

int _tmain(int argc, _TCHAR* argv[])
{
    cout << "Hello World";
    return 0;
}

какую строку я пропускаю?

20 ответов


начните проект с Сочетание Клавиш Ctrl+Клавишу F5 вместо Ф5.

окно консоли теперь будет оставаться открытым с Press any key to continue . . . сообщение после выхода программы.

обратите внимание, что для этого требуется Console (/SUBSYSTEM:CONSOLE) опция компоновщика, которую вы можете включить следующим образом:

  1. откройте проект и перейдите в Обозреватель решений. Если вы следуете вместе со мной в K&R, ваше "решение" будет "Привет" с 1 проектом под ним, а также "привет" в смелый.
  2. щелкните правой кнопкой мыши на" hello " (или как бы ни назывался ваш проект.)
  3. выберите "Свойства"в контекстном меню.
  4. Выберите Свойства Конфигурации>Компоновщик>Система.
  5. для свойства "подсистема"в правой области щелкните раскрывающийся список в правом столбце.
  6. выберите " консоль (/подсистема: консоль)"
  7. нажмите "Применить", дождитесь завершения работы, затем нажмите "ОК". (Если "применить" выделено серым цветом, выберите другой параметр подсистемы, нажмите кнопку Применить, затем вернитесь и примените параметр консоли. Мой опыт показывает, что OK сам по себе не будет работать.)

CTRL-F5 и подсказки подсистемы работают вместе; они не являются отдельными параметрами.

(любезно предоставлено DJMorreTX от http://social.msdn.microsoft.com/Forums/en-US/vcprerelease/thread/21073093-516c-49d2-81c7-d960f6dc2ac6)


стандартный путь cin.get() перед вашим оператором return.

int _tmain(int argc, _TCHAR* argv[])
{
    cout << "Hello World";
    cin.get();
    return 0;
}

поставить точку останова на return линии.

вы запускаете его в отладчике, верно?


другой вариант-использовать

#include <process.h>
system("pause");

хотя это не очень портативный, потому что он будет работать только на Windows, но он будет автоматически печатать

нажмите любую клавишу для продолжения...


для проектов makefile принятое решение не выполняется из - за ошибки в Visual Studio (которая присутствует по крайней мере до версии 2012-я еще не тестировал 2013). Эта ошибка подробно здесь.

чтобы приостановить работу консоли после завершения программы в проекте makefile, выполните следующие действия (это может отличаться для версий, отличных от 2010 - 2012):

1) Pass /SUBSYSTEM:CONSOLE компоновщику. - редактировать: см под.

2) Откройте файл проекта (.vcxproj) в текстовом редакторе.

3) Внутри корневой <project> тег, вставить следующее:

<ItemDefinitionGroup>
  <Link>
    <SubSystem>Console</SubSystem>
  </Link>
</ItemDefinitionGroup>

4) перезагрузите проект в своем решении.

5) запустите программу без отладки (CTRL + F5).

EDIT:

согласно моему комментарию ниже, установка опции компоновщика /SUBSYSTEM:CONSOLE на самом деле не имеет значения для проектов Makefile (и не обязательно даже возможно, если вы используете компилятор, отличный от MSVC). Все дело в том, что параметр добавляется .файл vcxproj, согласно шагу 3 выше.


можно использовать cin.get(); или cin.ignore(); непосредственно перед инструкцией return, чтобы избежать закрытия окна консоли.


просто добавьте точку останова в закрывающую скобку вашего _tmain метод. Это более простой способ плюс вам не нужно добавлять код для отладки.


просто поставьте точку останова на последней фигурной скобке main.

    int main () {
       //...your code...
       return 0;
    } //<- breakpoint here

это работает для меня, не нужно запускать без отладки. Он также выполняет деструкторы перед попаданием в точку останова, так что вы можете проверить любые сообщения печати на этих деструкторов, если у вас есть.


поместите точку останова на конец скобки main(). Он будет получить споткнулся даже с несколькими return заявления. Единственным недостатком является то, что вызов exit() не будет пойман.

Если вы не отлаживаете, следуйте советам в ответе Зойдберга и начните свою программу с Ctrl+Ф5 просто Ф5.


cin.get (), или system("PAUSE"). Я не слышал, что вы можете использовать return (0);


Я #include <conio.h> и затем добавить getch(); перед return 0; линии. Во всяком случае, так меня учили в школе. Я вижу, что методы, упомянутые выше, совершенно разные.


была та же проблема . Я использую _getch () непосредственно перед оператором return. Это работает.


у меня была та же проблема; в моем приложении есть несколько точек выхода (), и не было никакого способа узнать, где именно он выходит, тогда я узнал об этом:

atexit(system("pause"));

или

atexit(cin.get());

таким образом, он остановится независимо от того, где мы выходим из программы.


Мои 2 Цента:

выбор 1: добавьте точку останова в конце main()

выбор 2: Добавьте этот код перед return 0;:

std::cout << "Press ENTER to continue..."; //So the User knows what to do
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

вы должны включить <iomanip> на std::numeric_limits


(некоторые опции могут быть вызваны разными именами. Я не использую английскую версию)

У меня была такая же проблема, когда я создавал проекты с опцией "пустой проект", создавал проект как "Win32-консольное приложение" вместо "пустой проект" . В появившемся диалоговом окне вы нажимаете "Продолжить", после чего можете проверить опцию" пустой проект "и нажать "подтвердить". После этого CTRL + F5 откроет консоль, которая не закрывается автоматически.


можно просто поставить keep_window_open (); перед возвращением вот один пример

int main()
{
    cout<<"hello world!\n";
    keep_window_open ();
    return 0;
}

другой вариант:

#ifdef _WIN32
#define MAINRET system("pause");return 0
#else
#define MAINRET return 0
#endif

в главном:

int main(int argc, char* argv[]) {
    MAINRET;
}

просто добавьте систему ("пауза") в конце кода перед возвращением 0, как это

int main()
{
some code goes here
system("pause")
return 0;
}

на самом деле, реальным решением является выбор самого шаблона проекта. Необходимо выбрать консольное приложение Win32 в старой версии VS или сначала заполнить имя проекта, а затем дважды щелкните мастер рабочего стола Windows и выберите консольное приложение Win32. Затем выберите пустой проект на этом этапе. Это затем позволяет то, что оригинальный спрашивающий действительно хотел без добавления дополнительной точки остановки и удерживайте код. Я тоже прошел через эту проблему. Ответ также находится в MSDN сайт.


вот способ сохранить окно команды открытым независимо от того, как выполнение останавливается без изменения кода:

в Visual Studio откройте Страницы Свойств Проекта ->отладка.

на команда, enter $(ComSpec)

на Аргументы Командной Строки, enter /k $(TargetPath). Добавьте любые аргументы в собственное приложение.

теперь Ф5 или Сочетания Клавиш Ctrl-Клавишу F5 выполняет Windows / System32 / cmd.exe в новом окне, и / k гарантирует, что командная строка остается открытой после завершения обработки.

недостатком является то, что выполнение не останавливается на точках останова.