Ich beginne mit Visual C ++ und möchte wissen, wie das Konsolenfenster beibehalten wird.
Zum Beispiel wäre dies eine typische "Hallo Welt" -Anwendung:
int _tmain(int argc, _TCHAR* argv[])
{
cout << "Hello World";
return 0;
}
Was ist die Zeile, die ich vermisse?
visual-c++
console
Raúl Roa
quelle
quelle
Antworten:
Starten Sie das Projekt mit Ctrl+F5statt nur F5.
Das Konsolenfenster bleibt nun mit der
Press any key to continue . . .
Meldung geöffnet , nachdem das Programm beendet wurde.Beachten Sie, dass hierfür die
Console (/SUBSYSTEM:CONSOLE)
Linker-Option erforderlich ist , die Sie wie folgt aktivieren können:STRG-F5 und die Subsystemhinweise arbeiten zusammen. Sie sind keine separaten Optionen.
(Mit freundlicher Genehmigung von DJMorreTX von http://social.msdn.microsoft.com/Forums/en-US/vcprerelease/thread/21073093-516c-49d2-81c7-d960f6dc2ac6 )
quelle
cin.get(),getchar(), system("pause")
oder anderen Müll ändern . Das zu ändern funktioniert.system("pause");
am Ende Ihres Codes hinzu. Es macht Sinn und funktioniert gut.Der Standardweg ist
cin.get()
vor Ihrer Rückgabeerklärung.quelle
_tmain
. Ich würde ein weiteres -1 für wählen,cin.get()
anstatt einen Haltepunkt für F5 zu setzen oder Strg F5 zu verwenden. Aber ich darf nur einmal abstimmen._tmain
? Dies ist die Standardmethode zum Schreiben einer Windows-Anwendung für das Konsolensubsystem. Von diesem Standard abzuweichen, wäre eine schlechte Praxis. Es ist klar, dass hier niemand über tragbaren Code spricht. Die Frage lautet Visual C ++ und_tmain
ist die Signatur, die im Beispielcode angezeigt wird. Es ist Zeit, diese Religion aufzugeben. Windows ist standardmäßig "nicht standardisiert", und es gibt sehr gute Gründe, seinen Standards zu folgen ._tmain
ist, weil es völlig unnötig ist, nicht dem Standard zu entsprechen (der internationale C ++ - Standard erfordert eine einfache Ebenemain
), und weil es dasT
Makroschema von Microsoft verwendet, das für die Unterstützung von Windows 9x unnötig kompliziert und ausführlich ist. Wenn Sie der Meinung sind, dass eine Abweichung vom Standard eine schlechte Praxis ist, sollten Sie diese unbedingt nicht verwendentmain
. Es gibt keine guten Gründe für die Verwendungtmain
, außer für Trolling oder für Profis, um die totale Inkompetenz zu zeigen.Setzen Sie einen Haltepunkt auf die
return
Linie.Sie führen es im Debugger aus, richtig?
quelle
Eine andere Option ist zu verwenden
Dies ist zwar nicht sehr portabel, da es nur unter Windows funktioniert, aber automatisch gedruckt wird
quelle
system
wird in deklariert<stdlib.h>
.Bei Makefile-Projekten schlägt die akzeptierte Lösung aufgrund eines Fehlers in Visual Studio fehl (der mindestens bis zur Version 2012 vorhanden ist - ich habe 2013 noch nicht getestet). Dieser Fehler wird hier detailliert beschrieben .
Führen Sie die folgenden Schritte aus, damit die Konsole nach dem Beenden des Programms in einem Makefile-Projekt angehalten wird (dies kann für andere Versionen als 2010 - 2012 abweichen):
1)- BEARBEITEN : siehe unten./SUBSYSTEM:CONSOLE
An den Linker übergeben.2) Öffnen Sie Ihre Projektdatei (.vcxproj) in einem Texteditor.
3) Fügen Sie in das Root-
<project>
Tag Folgendes ein:4) Laden Sie das Projekt in Ihre Lösung neu.
5) Führen Sie das Programm ohne Debugging aus (STRG + F5).
BEARBEITEN:
Gemäß meinem Kommentar unten ist das Festlegen der Linker-Option
/SUBSYSTEM:CONSOLE
für Makefile-Projekte eigentlich irrelevant (und nicht unbedingt sogar möglich, wenn Sie einen anderen Compiler als MSVC verwenden). Alles, was zählt, ist, dass die Einstellung der .vcxproj-Datei gemäß Schritt 3 oben hinzugefügt wird.quelle
/SUBSYSTEM:CONSOLE
an den Linker tatsächlich irrelevant ist - Schritt 3 ist alles, was zählt. Denken Sie daran, dass sich meine Antwort auf Makefile-Projekte bezieht. In einem Makefile-Projekt kann die IDE nicht wissen, was Sie an den Linker übergeben (möglicherweise verwenden Sie nicht einmal einen Compiler mit einer/SUBSYSTEM:CONSOLE
Option), und es ist das Projekt selbst, die verfolgt, ob es sich um ein Konsolenprogramm handelt oder nicht. Ich werde meine Antwort entsprechend bearbeiten.Sie können
cin.get();
odercin.ignore();
kurz vor Ihrer return-Anweisung verwenden, um zu verhindern, dass das Konsolenfenster geschlossen wird.quelle
Setzen Sie einfach einen Haltepunkt auf die letzte geschweifte Klammer der Hauptleitung.
Es funktioniert für mich, es muss nicht ohne Debugging ausgeführt werden. Außerdem werden Destruktoren ausgeführt, bevor der Haltepunkt erreicht wird, sodass Sie überprüfen können, ob Nachrichten auf diesen Destruktoren gedruckt wurden, falls vorhanden.
quelle
Fügen Sie einfach einen Haltepunkt in die schließende Klammer Ihrer
_tmain
Methode ein. Dies ist der einfachere Weg und Sie müssen keinen Code hinzufügen, um zu debuggen.quelle
Setzen Sie einen Haltepunkt auf die Endklammer von
main()
. Es wird auch bei mehrerenreturn
Anweisungen ausgelöst . Der einzige Nachteil ist, dass ein Anrufexit()
nicht abgefangen wird.Wenn Sie nicht debuggen, folgen Sie den Anweisungen in Zoidbergs Antwort und starten Sie Ihr Programm mit Ctrl+ F5anstatt nur F5.
quelle
Meine 2 Cent:
Auswahl 1: Fügen Sie am Ende einen Haltepunkt hinzu
main()
Auswahl 2: Fügen Sie diesen Code direkt vor dem
return 0;
:Sie müssen enthalten
<iomanip>
fürstd::numeric_limits
quelle
Fügen Sie einfach das System ("Pause") am Ende des Codes hinzu, bevor Sie 0 wie folgt zurückgeben
quelle
quelle
cin.get()
odersystem("PAUSE")
. Ich habe nicht gehört, dass Sie verwenden könnenreturn(0);
quelle
Ich
#include <conio.h>
füge hinzu und füge danngetch();
kurz vor derreturn 0;
Zeile hinzu. Das habe ich sowieso in der Schule gelernt. Die oben genannten Methoden sind ganz anders, wie ich sehe.quelle
Hatte das gleiche Problem. Ich benutze
_getch()
kurz vor der return-Anweisung. Es klappt.quelle
(Einige Optionen können unter verschiedenen Namen aufgerufen werden. Ich verwende nicht die englische Version.)
Ich hatte das gleiche Problem, als ich Projekte mit der Option "leeres Projekt" erstellte, Projekt als "Win32-Konsolenanwendung" anstelle von "leeres Projekt" erstellen. In dem Dialogfeld, das jetzt angezeigt wird, drücken Sie "Weiter". Danach können Sie die Option "Projekt leeren" aktivieren und auf "Bestätigen" klicken. Danach öffnet STRG + F5 eine Konsole, die nicht automatisch geschlossen wird.
quelle
Ich hatte das gleiche Problem; In meiner Anwendung gibt es mehrere exit () - Punkte und es gab keine Möglichkeit zu wissen, wo genau es beendet wird. Dann habe ich Folgendes herausgefunden:
oder
Auf diese Weise wird es gestoppt, egal wo wir im Programm beenden.
quelle
atexit
.atexit
Nimmt einen Funktionszeiger, keine ganze Zahl.Andere Option:
In der Hauptsache:
quelle
Die eigentliche Lösung ist die Auswahl der Projektvorlage. Sie MÜSSEN die Win32-Konsolenanwendung in älterem VS auswählen oder zuerst den Projektnamen eingeben und dann auf den Windows-Desktop-Assistenten doppelklicken und dann die Win32-Konsolenanwendung auswählen. Wählen Sie dann an dieser Stelle ein leeres Projekt aus. Dies ermöglicht dann, was der ursprüngliche Fragesteller wirklich wollte, ohne zusätzlichen Haltepunkt hinzuzufügen und Code zu halten. Ich habe auch dieses Problem durchlaufen. Die Antwort ist auch auf der MSDN-Site.
quelle
Hier ist eine Möglichkeit, das Befehlsfenster offen zu halten, unabhängig davon, wie die Ausführung gestoppt wird, ohne dass Code geändert wird:
Öffnen Sie in Visual Studio Projekteigenschaftsseiten -> Debuggen .
Geben Sie als Befehl ein
$(ComSpec)
Geben Sie als Befehlsargumente ein
/k $(TargetPath)
. Fügen Sie Ihrer eigenen Anwendung Argumente hinzu.Jetzt F5 oder Strg-F5 führt windows / system32 / cmd.exe in einem neuen Fenster und / k sichergestellt , dass die Eingabeaufforderung bleibt nach Abschluss der Ausführung öffnen.
Der Nachteil ist, dass die Ausführung an Haltepunkten nicht stoppt.
quelle
Wie einige bereits betont haben, hängt die Zoidbergs-Lösung den Debugger nicht an, was Sie normalerweise nicht möchten.
Die beste Option imo ist, Ihren VS entsprechend zu konfigurieren (ab VS 2017), indem Sie zu Extras> Optionen> Debugging> Allgemein gehen. Dort deaktivieren Sie "Konsole automatisch schließen, wenn das Debuggen beendet wird" (ganz unten), was in Ihrem Fall wahrscheinlich aktiviert ist.
quelle
Sie können einfach keep_window_open () setzen; vor der Rückkehr hier ist ein Beispiel
quelle