Я починаю з Visual C ++ і хотів би знати, як зберегти вікно консолі.
Наприклад, це буде типовий додаток "привіт світ":
int _tmain(int argc, _TCHAR* argv[])
{
cout << "Hello World";
return 0;
}
Яку лінію мені не вистачає?
Я починаю з Visual C ++ і хотів би знати, як зберегти вікно консолі.
Наприклад, це буде типовий додаток "привіт світ":
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, орієнтованої на підсистему Console. Відхилення від цього стандарту - це була б погана практика. Зрозуміло, тут ніхто не говорить про портативний код; запитання говорить про 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) Перейдіть - EDIT : див. Нижче./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
можливість), і це проект сама відслідковує, чи призначена вона консольною програмою чи ні. Я відповідно відредагую свою відповідь.
просто поставте точку розриву на останній фігурний кронштейн основного.
int main () {
//...your code...
return 0;
} //<- breakpoint here
це працює для мене, не потрібно бігати без налагодження. Він також виконує деструктори перед тим, як вдарити точку розриву, щоб ви могли перевірити друк будь-яких повідомлень на цих деструкторах, якщо вони є.
Мої 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
просто додайте систему ("пауза") в кінці коду, перш ніж повернути 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 Console Application у старшій VS, або спочатку заповніть ім'я проекту, а потім двічі клацніть майстер робочого столу Windows, а потім виберіть консольну програму 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;
}