Zaczynam od Visual C ++ i chciałbym wiedzieć, jak zachować okno konsoli.
Na przykład byłaby to typowa aplikacja „hello world”:
int _tmain(int argc, _TCHAR* argv[])
{
cout << "Hello World";
return 0;
}
Jakiego wiersza mi brakuje?
Zaczynam od Visual C ++ i chciałbym wiedzieć, jak zachować okno konsoli.
Na przykład byłaby to typowa aplikacja „hello world”:
int _tmain(int argc, _TCHAR* argv[])
{
cout << "Hello World";
return 0;
}
Jakiego wiersza mi brakuje?
Odpowiedzi:
Rozpocznij projekt Ctrl+F5zamiast zamiast F5.
Okno konsoli pozostanie otwarte z Press any key to continue . . .
komunikatem po wyjściu z programu.
Pamiętaj, że wymaga to Console (/SUBSYSTEM:CONSOLE)
opcji linkera, którą możesz włączyć w następujący sposób:
CTRL-F5 i wskazówki do podsystemu działają razem; nie są osobnymi opcjami.
(Dzięki uprzejmości DJMorreTX z http://social.msdn.microsoft.com/Forums/en-US/vcprerelease/thread/21073093-516c-49d2-81c7-d960f6dc2ac6 )
cin.get(),getchar(), system("pause")
ani innych śmieci. Zmiana tego działa.
system("pause");
na końcu swojego kodu. Ma to sens i działa dobrze.
Standardowy sposób jest cin.get()
przed zwrotem.
int _tmain(int argc, _TCHAR* argv[])
{
cout << "Hello World";
cin.get();
return 0;
}
_tmain
. Głosowałbym na kolejne -1 cin.get()
zamiast zamiast punktu przerwania dla F5 lub używania Ctrl F5. Ale wolno mi tylko jedna opinia.
_tmain
? Jest to standardowy sposób pisania aplikacji Windows ukierunkowanej na podsystem konsoli. Odbieganie od tego standardu byłoby złym postępowaniem. Oczywiście nikt nie mówi o przenośnym kodzie; pytanie brzmi Visual C ++ i _tmain
jest sygnaturą, która pojawia się w przykładowym kodzie. Czas porzucić tę religię. Windows jest domyślnie „niestandardowy” i istnieją bardzo dobre powody, aby stosować się do jego standardów.
_tmain
jest spowodowane tym, że jest to całkowicie niepotrzebne niestandardowe (międzynarodowy standard C ++ wymaga zwykłego main
) i ponieważ wykorzystuje T
schemat makr Microsoftu , który jest niepotrzebną komplikacją i językiem do obsługi systemu Windows 9x. Jeśli czujesz, że odstępstwo od standardu jest złą praktyką, absolutnie nie powinieneś używać tmain
. Nie ma dobrych powodów do używania tmain
, z wyjątkiem trollingu lub, dla profesjonalistów, do wykazania całkowitej niekompetencji.
Inną opcją jest użycie
#include <process.h>
system("pause");
Chociaż nie jest to zbyt przenośne, ponieważ będzie działać tylko w systemie Windows, ale zostanie automatycznie wydrukowane
Naciśnij dowolny klawisz, aby kontynuować...
system
jest zadeklarowany w <stdlib.h>
.
W przypadku projektów makefile zaakceptowane rozwiązanie kończy się niepowodzeniem z powodu błędu w programie Visual Studio (który jest obecny przynajmniej do wersji 2012 - nie testowałem jeszcze 2013). Ten błąd jest szczegółowo opisany tutaj .
Aby zatrzymać konsolę po zakończeniu programu w projekcie makefile, wykonaj następujące kroki (może się to różnić w przypadku wersji innych niż 2010-2012):
1) Przejdź - EDYCJA : patrz poniżej./SUBSYSTEM:CONSOLE
do linkera.
2) Otwórz plik projektu (.vcxproj) w edytorze tekstu.
3) Wewnątrz <project>
znacznika głównego wstaw następujące elementy:
<ItemDefinitionGroup> <Link> <SubSystem>Console</SubSystem> </Link> </ItemDefinitionGroup>
4) Załaduj ponownie projekt do swojego rozwiązania.
5) Uruchom program bez debugowania (CTRL + F5).
EDYTOWAĆ:
Zgodnie z moim komentarzem poniżej ustawienie opcji linkera /SUBSYSTEM:CONSOLE
jest w rzeczywistości nieistotne dla projektów makefile (i niekoniecznie nawet możliwe, jeśli używasz kompilatora innego niż MSVC). Liczy się tylko to, że ustawienie zostanie dodane do pliku .vcxproj, jak w kroku 3 powyżej.
/SUBSYSTEM:CONSOLE
linkerowi jest w rzeczywistości nieistotne - liczy się tylko krok 3. Pamiętaj, że moja odpowiedź dotyczy projektów makefile - w projekcie makefile IDE nie ma sposobu, aby dowiedzieć się, co przekazujesz linkerowi (możesz nawet nie używać kompilatora, który ma /SUBSYSTEM:CONSOLE
opcję), a jest to projekt sam, który śledzi, czy ma być programem konsolowym. Odpowiednio zmienię swoją odpowiedź.
po prostu umieść punkt przerwania na ostatnim kręconym nawiasie głównym.
int main () {
//...your code...
return 0;
} //<- breakpoint here
działa dla mnie, nie ma potrzeby uruchamiania bez debugowania. Wykonuje także destruktory przed trafieniem do punktu przerwania, dzięki czemu można sprawdzić wszelkie komunikaty wydrukowane na tych destrukterach, jeśli takie istnieją.
Umieść punkt przerwania na końcowym nawiasie klamrowym main()
. Potknie się nawet przy wielu return
instrukcjach. Jedynym minusem jest to, że wezwanie doexit()
nie zostanie złapane.
Jeśli nie debugujesz, postępuj zgodnie ze wskazówkami zawartymi w odpowiedzi Zoidberga i uruchom program za pomocą Ctrl+ F5zamiast po prostu F5.
Moje 2 centy:
Wybór 1: Dodaj punkt przerwania na końcu main()
Wybór 2: Dodaj ten kod, tuż przed 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');
Musisz uwzględnić <iomanip>
dlastd::numeric_limits
cin.get()
Lub system("PAUSE")
. Nie słyszałem, że możesz użyćreturn(0);
Dołączam, #include <conio.h>
a następnie dodaję getch();
tuż przed return 0;
wierszem. Tego i tak nauczyłem się w szkole. Metody wymienione powyżej są zupełnie inne, widzę.
Miałem ten sam problem. Używam _getch()
tuż przed instrukcją return. To działa.
(Niektóre opcje mogą być wywoływane różnymi nazwami. Nie używam wersji angielskiej)
Miałem ten sam problem, kiedy tworzyłem projekty z opcją „pusty projekt”, Utwórz projekt jako „Aplikacja konsoli Win32” zamiast „pusty projekt”. W wyświetlonym oknie dialogowym naciśniesz „kontynuuj”, a następnie możesz zaznaczyć opcję „pusty projekt” i nacisnąć przycisk potwierdzenia. Następnie CTRL + F5 otworzy konsolę, która nie zamyka się automatycznie.
Miałem ten sam problem; W mojej aplikacji jest wiele punktów wyjścia () i nie było sposobu, aby wiedzieć, gdzie dokładnie wychodzi, wtedy dowiedziałem się o tym:
atexit(system("pause"));
lub
atexit(cin.get());
W ten sposób przestanie działać bez względu na to, gdzie wyjdziemy z programu.
atexit
. atexit
przyjmuje wskaźnik funkcji, a nie liczbę całkowitą.
W rzeczywistości prawdziwym rozwiązaniem jest wybór samego szablonu projektu. MUSISZ wybrać aplikację konsoli Win32 w starszym VS lub wypełnić najpierw nazwę projektu, a następnie dwukrotnie kliknąć kreatora pulpitu systemu Windows, a następnie wybrać aplikację konsoli Win32. Następnie wybierz pusty projekt w tym momencie. Pozwala to na to, czego naprawdę chciał pierwotny pytający bez dodawania dodatkowego punktu zatrzymania i kodu wstrzymania. Przeszedłem również przez ten problem. Odpowiedź znajduje się również na stronie MSDN.
Oto sposób na pozostawienie otwartego okna poleceń bez względu na to, jak wykonanie się zatrzymuje bez modyfikowania kodu:
W Visual Studio otwórz Strony właściwości projektu -> Debugowanie .
W polu Command wpisz$(ComSpec)
W polu Argumenty poleceń wprowadź /k $(TargetPath)
. Dołącz dowolne argumenty do własnej aplikacji.
Teraz F5 lub Ctrl-F5 wykonuje Windows / System32 / cmd.exe w nowym oknie, a / k zapewnia, że wiersz polecenia pozostanie otwarty po zakończeniu wykonywania.
Minusem jest to, że wykonanie nie kończy się na punktach przerwania.
Jak niektórzy już zauważyli, rozwiązanie Zoidbergs nie dołącza debuggera, czego zwykle nie chcesz.
Najlepszą opcją imo jest odpowiednie skonfigurowanie VS (od VS 2017 r.), Przechodząc do Narzędzia> Opcje> Debugowanie> Ogólne. Tam odznaczasz „Automatycznie zamykaj konsolę po zatrzymaniu debugowania” (na samym dole), co prawdopodobnie jest zaznaczone w twoim przypadku.
możesz po prostu umieścić keep_window_open (); przed powrotem tutaj jest jeden przykład
int main()
{
cout<<"hello world!\n";
keep_window_open ();
return 0;
}