Я начинаю с Visual C ++, и я хотел бы знать, как сохранить окно консоли.
Например, это будет типичное приложение "Hello World":
int _tmain(int argc, _TCHAR* argv[])
{
cout << "Hello World";
return 0;
}
Какую черту я пропускаю?
Я начинаю с Visual C ++, и я хотел бы знать, как сохранить окно консоли.
Например, это будет типичное приложение "Hello World":
int _tmain(int argc, _TCHAR* argv[])
{
cout << "Hello World";
return 0;
}
Какую черту я пропускаю?
Ответы:
Начните проект с, Ctrl+F5а не просто F5.
Теперь окно консоли будет оставаться открытым с Press any key to continue . . .
сообщением после выхода из программы.
Обратите внимание, что для этого требуется Console (/SUBSYSTEM:CONSOLE)
опция компоновщика, которую можно включить следующим образом:
CTRL-F5 и подсказки подсистемы работают вместе; они не являются отдельными вариантами.
(Предоставлено DJMorreTX от http://social.msdn.microsoft.com/Forums/en-US/vcprerelease/thread/21073093-516c-49d2-81c7-d960f6dc2ac6 )
cin.get(),getchar(), system("pause")
или любой другой мусор. Изменение это работает.
system("pause");
в конце вашего кода. Это имеет смысл и прекрасно работает.
Стандартный способ - cin.get()
до вашего заявления о возврате.
int _tmain(int argc, _TCHAR* argv[])
{
cout << "Hello World";
cin.get();
return 0;
}
_tmain
. Я бы проголосовал за -1 cin.get()
вместо того, чтобы ставить точку останова для F5 или использовать Ctrl F5. Но мне разрешили только одно понижение.
_tmain
? Это стандартный способ написания приложения для Windows, ориентированного на консольную подсистему. Отклонение от этого стандарта - это то, что было бы плохой практикой. Очевидно, что здесь никто не говорит о переносимом коде; вопрос говорит Visual C ++ и _tmain
является подписью, которая появляется в примере кода. Пришло время отказаться от этой религии. По умолчанию Windows является «нестандартной», и есть очень веские причины для ее соблюдения .
_tmain
заключается в том, что это совершенно ненужный нестандарт (международный стандарт C ++ требует простого main
), а также потому, что он использует макросхему Microsoft T
, которая является ненужным усложнением и словоблудием для поддержки Windows 9x. Если вы чувствуете, что отклонение от стандарта является плохой практикой, то вам абсолютно не следует его использовать tmain
. Нет никаких веских причин для использования tmain
, кроме троллинга или для профессионалов, для отображения своей полной некомпетентности.
Другой вариант заключается в использовании
#include <process.h>
system("pause");
Хотя это не очень портативный, потому что он будет работать только на Windows, но он будет автоматически печатать
Нажмите любую клавишу чтобы продолжить...
system
объявлен в <stdlib.h>
.
Для проектов makefile принятое решение терпит неудачу из-за ошибки в Visual Studio (которая присутствует по крайней мере до версии 2012 - я еще не тестировал 2013). Эта ошибка подробно описана здесь .
Чтобы консоль приостановилась после завершения программы в проекте makefile, выполните следующие действия (это может отличаться для версий, отличных от 2010 - 2012):
1) Перейдите - РЕДАКТИРОВАТЬ : см. Ниже./SUBSYSTEM:CONSOLE
на компоновщик.
2) Откройте файл вашего проекта (.vcxproj) в текстовом редакторе.
3) Внутри корневого <project>
тега вставьте следующее:
<ItemDefinitionGroup> <Link> <SubSystem>Console</SubSystem> </Link> </ItemDefinitionGroup>
4) Перезагрузите проект в вашем решении.
5) Запустите программу без отладки (CTRL + F5).
РЕДАКТИРОВАТЬ:
Согласно моему комментарию ниже, установка опции компоновщика на /SUBSYSTEM:CONSOLE
самом деле не имеет значения для проектов makefile (и не обязательно даже возможна, если вы используете компилятор, отличный от MSVC). Все, что имеет значение, это то, что параметр добавляется в файл .vcxproj, как описано в шаге 3 выше.
/SUBSYSTEM:CONSOLE
к компоновщику на самом деле не имеет значения - шаг 3 - это все, что имеет значение. Помните, что мой ответ относится к проектам makefile - в проекте makefile среда IDE не может узнать, что вы передаете компоновщику (возможно, вы даже не используете компилятор, у которого есть /SUBSYSTEM:CONSOLE
опция), и это проект сама, которая отслеживает, является ли она консольной программой. Я отредактирую свой ответ соответственно.
просто поставьте точку останова на последней фигурной скобке main.
int main () {
//...your code...
return 0;
} //<- breakpoint here
это работает для меня, нет необходимости работать без отладки. Он также выполняет деструкторы перед достижением точки останова, поэтому вы можете проверить любые сообщения, напечатанные на этих деструкторах, если они у вас есть.
Поместите точку останова на конечную скобку main()
. Он будет отключен даже с несколькими return
утверждениями. Единственным недостатком является то, что вызов exit()
не будет пойман.
Если вы не отлаживаете, следуйте советам в ответе Зойдберга и начните свою программу с Ctrl+ F5вместо просто F5.
Мои 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
просто добавьте system ("pause") в конце кода перед возвратом 0, как это
#include <stdlib.h>
int main()
{
//some code goes here
system("pause")
return 0;
}
cin.get()
или system("PAUSE")
. Я не слышал, что вы можете использоватьreturn(0);
Я включаю #include <conio.h>
и затем добавляю getch();
прямо перед return 0;
строкой. Это то, чему я научился в школе. Методы, упомянутые выше здесь, совсем другие, я вижу.
Была такая же проблема. Я использую как _getch()
раз перед возвратом заявления. Оно работает.
(Некоторые варианты могут называться разными именами. Я не использую английскую версию)
У меня была такая же проблема, когда я создавал проекты с опцией «пустой проект», создайте проект как «Win32-консольное приложение» вместо «пустой проект». В появившемся диалоговом окне вы нажимаете «продолжить», после чего вы можете проверить опцию «пустой проект» и нажать «Подтвердить». После этого CTRL + F5 откроет консоль, которая не закрывается автоматически.
У меня такая же проблема; В моем приложении есть несколько точек выхода (), и не было никакого способа узнать, где именно оно выходит, тогда я узнал об этом:
atexit(system("pause"));
или
atexit(cin.get());
Таким образом, это остановится независимо от того, где мы выйдем из программы.
atexit
. atexit
принимает указатель на функцию, а не целое число
Собственно, реальным решением является выбор самого шаблона проекта. Вы ДОЛЖНЫ выбрать консольное приложение Win32 в более старой версии VS или сначала ввести имя проекта, а затем дважды щелкнуть мастер Windows Desktop, а затем выбрать консольное приложение Win32. Затем выберите пустой проект в этой точке. Затем это позволяет получить то, чего действительно хотел исходный вопросник, без добавления дополнительной точки остановки и кода удержания. Я тоже прошел через эту проблему. Ответ также на сайте MSDN.
Вот способ сохранить командное окно открытым независимо от того, как выполнение останавливается без изменения какого-либо кода:
В Visual Studio откройте Страницы свойств проекта -> Отладка .
Для команды введите$(ComSpec)
Для командных аргументов введите /k $(TargetPath)
. Добавьте любые аргументы в ваше собственное приложение.
Теперь F5 или Ctrl-F5 запускает Windows / System32 / cmd.exe в новом окне, а / k гарантирует, что командная строка остается открытой после завершения выполнения.
Недостатком является то, что выполнение не остановится на контрольных точках.
Как уже отмечали некоторые, решение Zoidbergs не подключает отладчик, чего вы обычно не хотите.
Лучший вариант imo - настроить VS соответствующим образом (начиная с VS 2017 года), выбрав Сервис> Параметры> Отладка> Общие. Там вы снимаете флажок «Автоматически закрывать консоль при прекращении отладки» (в самом низу), что, вероятно, проверено в вашем случае.
Вы можете просто поставить keep_window_open (); перед возвращением вот один пример
int main()
{
cout<<"hello world!\n";
keep_window_open ();
return 0;
}